当我在DataContext中手动打开连接时,应该遵循什么模式
本文关键字:模式 什么 连接 DataContext | 更新日期: 2023-09-27 18:20:16
Linq2Sql不支持存储过程(1,2)的表值参数。
因此,我在DataContext中添加了对表值参数的丑陋支持(只是为了保持一致,并且仍然能够在同一数据上下文中调用我的过程)。
我调用this.Connection.CreateCommand()
,将其转换为SqlCommand
(因为它无论如何都将是SqlCommand
来支持TVP),手动列出所有参数,包括SqlDbType.Structured
和ExecuteNonQuery
。
这很好用
但是
在我的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
管理它的生命周期,还是有一种模式可以遵循
编辑:
实验表明,如果我只是打开它,它的行为会很好,并自动尊重环境事务(如果有的话)。然而,我更希望在这方面有一个可靠的建议。
如果您不需要分布式事务,请避免使用System.Trasactions。相反,请参阅我的TextMetal项目、示例代码,并注意Plumbing命名空间。如果你有问题,请给我发电子邮件。没有MSDTC的轻微失误,只需正确生成ADO.NET/LINQ to SQL,一个工作单元模式,以及一些精心设计的数据访问代码!
如果有令人信服的理由使用System.Transactions,那么我建议您仍然尽快关闭连接,因为在将连接释放到池后,事务协调器将管理提交/回滚。