实体连接和已打开的SqlConnection

4
我有一个关于使用CodeFirst方式的EntityFramework的问题。根据EntityConnection的源代码和文档,我无法创建已经打开的SqlConnection。这需要关闭SqlConnection。
我们有一些不同的数据库数据层(nHibernate等),如果我们可以在它们之间重用同一个SqlConnection就很好了。但是似乎EntityFramework不允许这样做。我可以将关闭的SqlConnection传递给DbContext,但每个DbContext都关闭连接对我来说不是很好。
有没有一种重用已打开的sql连接的方法?
编辑:
在EF成为OpenSource后,我能够更新它。我更改的唯一一行是System.Data.Entity.Core.EntityClient.EntityConnection类的构造函数中的一行。
if (connection.State != ConnectionState.Closed)
{
//throw new ArgumentException(Strings.EntityClient_ConnectionMustBeClosed);
}

在我抛出异常后,我可以重复使用已打开的SQL连接,并且在DBContext使用它之后,它不会关闭它,而且仍然可用于其他事情。

我的示例代码:

var connection = new SqlConnection(connectionString);
connection.Open();

MetadataWorkspace workspace = GetWorkspace(connection); // I loaded it from the same context, and save it in memory.

EntityConnection eConnection = new EntityConnection(workspace, connection);

using(var context = new EFContext(connection, false))
{
    var someData = context.SomeTable.ToList();
}

connection.Close();

你使用了这个构造函数吗? - Eranga
是的,我试过了,但它需要关闭连接。 - Sergey Litvinov
1个回答

5

目前不支持将已打开的连接传递给上下文,因为上下文内部始终使用 EntityConnection ,如果您查看文档,将会发现传递的存储连接必须处于关闭状态。

解决方法可以是在使用其他数据访问技术之前创建上下文并显式地打开连接。

objectContext.Connection.Open();

现在,您应该能够在上下文范围内重用 SqlConnection
var dbConnection = ((EntityConnection)objectContext.Connection).StoreConnection;

如果您正在使用DbContext API,我建议您阅读这篇文章,了解如何解决与DbContext相关的问题。


SqlConnection sqlConn = ((EntityConnection)objectContext.Connection).StoreConnection as SqlConnection; SQL连接sqlConn = ((EntityConnection)objectContext.Connection).StoreConnection as SqlConnection; - ChinaHelloWorld

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