问题 没有配置文件的实体框架6?


我有一个不能使用配置文件的应用程序,必须通过代码(使用EntityConnectionStringBuilder)为实体上下文设置连接字符串。

然而问题来自于此:

没有为ADO.NET提供程序找到具有不变名称“System.Data.SqlClient”的实体框架提供程序。

由于我无法使用标准的app.config文件,我是否搞砸了EF6?如果我没记错的话,这在EF4中不是问题。 因此,entityFramework-tag中的设置是我希望在代码中设置的。

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>

2318
2018-03-20 16:23


起源



答案:


我正在使用没有App.config文件的EF 6我只是将连接字符串传递给我的DBContext(连接是从其他地方的配置文件中读出来的,但这取决于你)。只需从配置文件中删除所有EF内容。

以下是我如何使用它。

public partial class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext(string connectionString,
                                         DbValidationMode validationMode = DbValidationMode.Enabled,
                                         DbLazyLoadingMode lazyLoadingMode = DbLazyLoadingMode.Disabled,
                                         DbAutoDetectMode autoDetectMode = DbAutoDetectMode.Enabled)
            : base(((EntityConnectionStringBuilder)new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                ProviderConnectionString = connectionString,
                Metadata = @"res://*/Contexts.Test.MyModel.csdl|res://*/Contexts.Test.MyModel.ssdl|res://*/Contexts.Test.MyModel.msl"
            }).ToString())
            { 
                    this.Configuration.ValidateOnSaveEnabled = validationMode.Equals(DbValidationMode.Enabled);
                    this.Configuration.LazyLoadingEnabled = lazyLoadingMode.Equals(DbLazyLoadingMode.Enabled);
                    this.Configuration.AutoDetectChangesEnabled = autoDetectMode.Equals(DbAutoDetectMode.Enabled);
            }
... Etc  

然后我只是将这个上下文注入我的所有服务中。

我正在使用Database First设计,所以我发现修改T4模板更容易。

可能有更好的方法可以做到这一点,但我没有遇到任何问题。


12
2018-03-20 16:34



我遇到的问题是我没有包含EntityFramework.SQLServer.dll。将此标记为答案,因为它很好地回答了问题本身(我自己就这样做了)。 - Jens


答案:


我正在使用没有App.config文件的EF 6我只是将连接字符串传递给我的DBContext(连接是从其他地方的配置文件中读出来的,但这取决于你)。只需从配置文件中删除所有EF内容。

以下是我如何使用它。

public partial class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext(string connectionString,
                                         DbValidationMode validationMode = DbValidationMode.Enabled,
                                         DbLazyLoadingMode lazyLoadingMode = DbLazyLoadingMode.Disabled,
                                         DbAutoDetectMode autoDetectMode = DbAutoDetectMode.Enabled)
            : base(((EntityConnectionStringBuilder)new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                ProviderConnectionString = connectionString,
                Metadata = @"res://*/Contexts.Test.MyModel.csdl|res://*/Contexts.Test.MyModel.ssdl|res://*/Contexts.Test.MyModel.msl"
            }).ToString())
            { 
                    this.Configuration.ValidateOnSaveEnabled = validationMode.Equals(DbValidationMode.Enabled);
                    this.Configuration.LazyLoadingEnabled = lazyLoadingMode.Equals(DbLazyLoadingMode.Enabled);
                    this.Configuration.AutoDetectChangesEnabled = autoDetectMode.Equals(DbAutoDetectMode.Enabled);
            }
... Etc  

然后我只是将这个上下文注入我的所有服务中。

我正在使用Database First设计,所以我发现修改T4模板更容易。

可能有更好的方法可以做到这一点,但我没有遇到任何问题。


12
2018-03-20 16:34



我遇到的问题是我没有包含EntityFramework.SQLServer.dll。将此标记为答案,因为它很好地回答了问题本身(我自己就这样做了)。 - Jens


在EF6中你可以使用 基于代码的配置 for Entity Framework特定设置。 (另见 如何在代码中添加实体框架6提供程序?)。然后,您可以构建连接字符串并将其传递给上下文的ctor。


4
2018-03-20 18:43