在现有的SqlConnection中打开一个DbContext连接

4
我很感兴趣是否应该在现有的 ADO.NET SqlConnection 中打开 Entity Framework 的 DbContext 连接,前提是它们都使用相同的连接字符串,即在完全相同的数据库上操作?例如:
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,存在任何危险性吗?

数据库版本不重要。你使用的 EF 版本是什么? - Panagiotis Kanavos
1个回答

4

连接字符串并不是连接本身。您从未将实际的连接传递给上下文,因此它必须创建一个新的连接。因此,事务将升级为分布式事务,以覆盖两个连接。

您需要使用适当的构造函数将实际连接对象传递给上下文。这样,只会有一个单一的本地事务,而无需将其升级为分布式事务。

在EF6+中,您可以简单地传递连接对象。将您的方法更改为以下内容:

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

在之前的版本中,您无法传递需要一些不愉快的体操动作的打开连接,如此处所述。

相关文章 https://msdn.microsoft.com/zh-cn/library/dn456849(v=vs.113).aspx 和 https://msdn.microsoft.com/zh-cn/library/dn456843(v=vs.113).aspx - Rory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接