2

我正在使用带有 Code First 的实体框架 5。我已经编写了一个自定义IDbConnectionFactory,我想将它用于我的DbContext类建立的所有连接,所以在应用程序生命周期的早期,在完成任何数据库工作之前,我调用

Database.DefaultConnectionFactory = new MyConnectionFactory();

但是,MyConnectionFactory.CreateConnection从未调用过,这向我表明 EF 已将其改回 - 但调试器显示MyConnectionFactory在运行了几个查询后它仍然是一个。出于某种原因,它只是不使用它。

MyDbContext通过传递 app.config 文件中的连接字符串的名称进行初始化,并且这些连接字符串确实指定了一个显式提供程序(实际上它们必须这样做),所以我想知道这是否会导致连接的每个连接覆盖基于连接字符串的工厂。这种情况会发生吗?我可以在不注册一个全新的提供商的情况下停止它(尽管这可能不太难做到?)。

无论我在网上看到什么(在各种 app.config 示例中被 defaultConnectionFactory 标记所掩盖)都表明您可以将其更改IDbConnectionFactory为您选择的实例,它会起作用,但我的行为不正常。

这样做的目的是让我在打开新连接时运行一组特定的 SQL 语句,所以这个问题的第二部分是有人知道更好的方法吗?

4

2 回答 2

5

我知道这并不理想,但这对我有用:

public class DBBase : DbContext
{
    public DBBase(string nameOrConnectionString)
        : base(Database.DefaultConnectionFactory.CreateConnection(nameOrConnectionString), true)
    {
    }
    // ...
}
于 2013-05-09T01:20:29.587 回答
0

您需要获得为要使用的每个呼叫建立的连接。例如使用以下代码。

private static void UsingCustomConnection()
{
    using (var conn = Database.DefaultConnectionFactory.CreateConnection("YourDbName"))
    {
        using (var context = new YourContext(conn))
        {
            context.Destinations.Add(new Destination {Name = "Colorado"});
            context.SaveChanges();
        }
    }
}

您需要在 YourContext 中进行设置

public YourContext(DbConnection connection)
    : base(connection, contextOwnsConnection: false)
{

}
于 2013-02-27T23:47:01.780 回答