我被困在EF 6中并且文档稀疏 - 现在没有解决这一问题。
我尝试在我们拥有的数据库存储库上使用Code First。由于复杂的初始化,我必须使用我自己的工厂方法来初始化上下文子类,并且必须将我自己的sql连接放入,或者自己创建工厂。
以下类初始化:
我们有:
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提供程序。
我完全不在乎如何解决这个问题。
使用Web应用程序中的配置文件为:
<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>
任何人都可以告诉我如何解决这个问题?我的替代方案是首先回到模型 - 但我真的想先在这里尝试代码。
答案 0 :(得分:1)
我对我的项目有相同的要求: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
}