在现有SqlConnection中打开DbContext连接

时间:2014-10-09 09:31:21

标签: c# sql-server entity-framework connection-pooling msdtc

我感兴趣的是,如果它们都使用相同的连接字符串,即在完全相同的数据库上运行,则不鼓励在现有ADO.NET DbContext中打开实体框架的SqlConnection连接?

例如:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new System.TimeSpan(0, 30, 0)))
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        DoStuffWithEF(connectionString);
        ...
    }
}

void DoStuffWithEF(string connectionString)
{
    using (var context = new MyCodeFirstDbContext(connectionString))
    {
        // basic LINQ queries ...
    }
}
  1. 在这两种情况下,连接是否被重用,因为 连接字符串指的是两者中的相同SQL Server 2012数据库 案件?
  2. 此类操作是否存在MSDTC的危险?

1 个答案:

答案 0 :(得分:4)

连接字符串连接。您永远不会将实际连接传递给上下文,因此必须创建一个新连接。因此,事务将升级到分布式事务,以便覆盖两个连接。

您需要使用the appropriate constructor将实际连接对象传递给上下文。在这种情况下,只有一个本地事务,不需要将其升级为分布式事务。

在EF6 +中你可以simply pass the connection object。将您的方法更改为:

void DoStuffWithEF(SqlConnection connection)
{
    using(var context=new MyCodeFirstDbContext(connection,false)
    {
    // ...
    }
}

在之前的版本中,您无法传递需要一些令人不快的体操的开放式连接,如here所述