我被困在 EF 6 中,而且文档很少——现在一天都没有解决这个问题。
我尝试在我们拥有的数据库存储库上使用 Code First。由于复杂的初始化我must使用我自己的工厂方法来初始化上下文子类,我must放入我自己的 sql 连接,或者创建我自己的工厂。
以下类初始化:
we have:
public class Repository : DbContext {
static string _connectionString;
static Repository() {
Database.SetInitializer<Repository>(null);
var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
_connectionString = ** method to get connection string**
}
public static Repository Create() {
SqlConnection connection = new SqlConnection(_connectionString);
connection.Open();
connection.BeginTransaction(IsolationLevel.ReadCommitted).Commit();
return new Repository(connection);
}
遗憾的是,在第一次尝试选择某个实体时,运行它会出现以下异常:
无法确定“System.Data.SqlClient.SqlClientFactory”类型的提供程序工厂的提供程序名称。确保 ADO.NET 提供程序已安装或在应用程序配置中注册。
我完全不知道如何解决这个问题。
我在使用网络应用程序中的配置文件如下:
<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, Version=6.0.0.0" />
</providers>
</entityFramework>
谁能告诉我如何解决这个问题?我的选择是先回到模型 - 但我真的很想在这里先尝试一下代码。
我对我的项目有相同的要求:EF 存储库必须接受从我自己的工厂创建的连接实例。为此,我选择完全忽略 EF 配置文件方案。相反,我做了以下事情:
public class Repository : DbContext
{
static Repository ()
{
Database.SetInitializer<Repository>(null);
}
public Repository(SqlConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// creating the model myself
}
// (...)
}
因为它可以接受来自外部的连接实例,所以我可以自由地使用我想要的任何连接工厂,并完全忽略 EF 的配置文件方案。
如果您希望连接工厂位于存储库中(为了分离问题,我不建议这样做),您可以将以下内容添加到上面:
public Repository()
: base(CreateConnection(), true)
{
}
private static SqlConnection CreateConnection()
{
// do whatever you have to do to create your SqlConnection instance, using your own rules
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)