将EF存储库与自定义连接对象一起使用?

时间:2014-02-05 13:02:45

标签: .net entity-framework entity-framework-6

我被困在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>

任何人都可以告诉我如何解决这个问题?我的替代方案是首先回到模型 - 但我真的想先在这里尝试代码。

1 个答案:

答案 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
}