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

发布于 2024-12-01 06:10:22 字数 556 浏览 3 评论 0原文

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

这是示例代码:

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

    }
}

I'm passing a SqlConnection to a function. Multiple object contexts are created in each function. I would like to use the single SqlConnection that I passed for all the object contexts somehow so that I will be able to use it under single Transaction scope without turning the distributed transaction service on.

This is the sample code:

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

    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放飞的风筝 2024-12-08 06:10:22

这似乎不是一个好的方法。你为什么要这样做?要实现此工作,您必须:

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

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

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

This doesn't seem like a good approach. Why are you doing this? To make this work you will have to:

  • Use the same connection string for all contexts = same database
  • Use the same metadata (mapping) for all contexts or pass a separate metadata set for each context
  • The connection must be closed until all contexts are created if any context or operation opens the connection, a next context creation will fail

So unless you are using some complex database where mapping was divided into multiple EDMXs this whole concept is wrong. One operation on one database = one unit of work = one context = one connection. In your case it looks like you want to do this with single entity type - WHY?

Moreover passing own collection to object contexts will not allow contexts to handle the connection in the optimal way (releasing it when they don't need it).

白云悠悠 2024-12-08 06:10:22

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

这是有关如何使用连接池的指南

A better solution would be a connection pool.
Create a connection object in object, connect with pooling options on.
The next time you connect it will check to see if an connection is still active and use it.
If there is no connection it will make one.

Here is a guide on how you use connection pools

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文