我对使用CodeFirst方法的EntityFramework有疑问。基于EntityConnection源代码和文档,我无法使用已打开的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();
答案 0 :(得分:5)
目前不支持将打开的连接传递给上下文,因为上下文内部始终使用EntityConnection
,如果您检查文档,您将看到传递的商店连接必须处于关闭状态。
解决方法可以是在使用其他数据访问技术之前创建上下文并明确打开连接
objectContext.Connection.Open();
现在您应该能够在上下文范围内重用SqlConnection
:
var dbConnection = ((EntityConnection)objectContext.Connection).StoreConnection;
如果您使用的是DbContext API,我建议您阅读this article,了解有关如何使用DbContext
解决问题的其他详细信息。