如何将现有的SqlConnection传递给多个ObjectContexts

时间:2011-08-24 18:10:42

标签: .net entity-framework transactionscope sqlconnection objectcontext

我正在将SqlConnection传递给函数。在每个函数中创建多个对象上下文。我想以某种方式使用我为所有对象上下文传递的单个SqlConnection,这样我就可以在单个Transaction范围内使用它,而无需打开分布式事务服务。

这是示例代码:

public bool InsertObjects<T>(TransactionScope transaction, SqlConnection sqlConnection, IEnumerable<T> objectsToInsert)
{
using (EntityConnection conn = GetEntityConnection())
    {
        Type objectContextType;
        ObjectContext objectContext = (ObjectContext) Activator.CreateInstance(objectContextType, new object[] {conn});

        //Some code using the objectContext

    }
}

2 个答案:

答案 0 :(得分:1)

这似乎不是一个好方法。你为什么做这个?要完成这项工作,您必须:

  • 对所有上下文使用相同的连接字符串=相同的数据库
  • 对所有上下文使用相同的元数据(映射)或为每个上下文传递单独的元数据集
  • 必须关闭连接,直到创建所有上下文,如果任何上下文或操作打开连接,下一个上下文创建将失败

因此,除非您使用一些复杂的数据库,其中映射被划分为多个EDMX,这整个概念都是错误的。一个数据库上的一个操作=一个工作单元=一个上下文=一个连接。在您的情况下,您似乎想要使用单一实体类型执行此操作 - 为什么?

此外,将自己的集合传递给对象上下文将不允许上下文以最佳方式处理连接(在不需要它时释放它)。

答案 1 :(得分:0)

更好的解决方案是连接池。
在对象中创建连接对象,连接池化选项 下次连接时,将检查连接是否仍处于活动状态并使用它 如果没有连接则会生成一个。

Here is a guide on how you use connection pools