当我在DataContext中手动打开连接时,应该遵循什么模式

本文关键字:模式 什么 连接 DataContext | 更新日期: 2023-09-27 18:20:16

Linq2Sql不支持存储过程(1,2)的表值参数。

因此,我在DataContext中添加了对表值参数的丑陋支持(只是为了保持一致,并且仍然能够在同一数据上下文中调用我的过程)。

我调用this.Connection.CreateCommand(),将其转换为SqlCommand(因为它无论如何都将是SqlCommand来支持TVP),手动列出所有参数,包括SqlDbType.StructuredExecuteNonQuery

这很好用
但是
在我的helper方法中,我必须打开上下文连接,因为它可能已关闭因为我手动打开连接,所以我必须手动关闭它吗

我经历过这些:
如果我使用Linq,是否必须手动关闭SQL连接
我应该何时处理数据上下文
如果我使用DataContext,到数据库的连接何时开始?

但他们实际上并没有回答我的问题。我知道在枚举结果时连接是关闭的,但它比这更复杂。与枚举结果相反,调用方法不是只读操作
此外,如果有环境事务,DataContext在第一个方法调用后肯定不会关闭连接

using (var ambient_tran = new System.Transactions.TransactionScope())
{
    using (var dx = new SomeDataContext()) 
    {
        dx.CallMethodOne(foo, bar);
        dx.CallMethodTwo(bar, baz); // executed on same connection and same transaction,
                                    // can see uncommitted data entered by CallMethodOne
    }
    ambient_tran.Complete();
};

正因为如此,我不确定在连接方面应该做什么才是正确的
我只是想打开连接,让DataContext管理它的生命周期,还是有一种模式可以遵循


编辑:

实验表明,如果我只是打开它,它的行为会很好,并自动尊重环境事务(如果有的话)。然而,我更希望在这方面有一个可靠的建议。

当我在DataContext中手动打开连接时,应该遵循什么模式

如果您不需要分布式事务,请避免使用System.Trasactions。相反,请参阅我的TextMetal项目、示例代码,并注意Plumbing命名空间。如果你有问题,请给我发电子邮件。没有MSDTC的轻微失误,只需正确生成ADO.NET/LINQ to SQL,一个工作单元模式,以及一些精心设计的数据访问代码!

如果有令人信服的理由使用System.Transactions,那么我建议您仍然尽快关闭连接,因为在将连接释放到池后,事务协调器将管理提交/回滚。