因此,我在我的 DataContext 中添加了对表值参数的丑陋支持(只是为了保持一致并且仍然能够从相同的数据上下文中调用我的过程)。
我调用this.Connection.CreateCommand()
,将其转换为SqlCommand
(因为SqlCommand
无论如何它都将支持 TVP),手动列出所有参数,包括参数SqlDbType.Structured
和ExecuteNonQuery
它。
这工作正常。
但。
在我的辅助方法中,我必须打开上下文连接,因为它可能已关闭。因为我手动打开连接,我必须手动关闭它吗?
我经历过这些:
如果我使用 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
管理它的生命周期,还是有一个模式可以遵循?
编辑:
实验表明,如果我让它保持打开状态,它会表现良好并自动尊重环境事务(如果有)。但是,我更喜欢对此提出可靠的建议。