我有一个不能使用配置文件的应用程序,必须通过代码(使用EntityConnectionStringBuilder)为实体上下文设置连接字符串。
问题来自于:
找不到具有不变名称' System.Data.SqlClient'的ADO.NET提供程序的实体框架提供程序。
由于我无法使用标准的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>
答案 0 :(得分:12)
我在没有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模板更容易。
可能有更好的方法可以做到这一点,但我根本没有遇到任何问题。
答案 1 :(得分:4)
在EF6中,您可以使用Code-based Configuration进行特定于实体框架的设置。 (另见How to add entity framework 6 provider in code?)。然后,您可以构建连接字符串并将其传递给上下文的ctor。