因此,我在DataContext中为表值参数添加了一个丑陋的支持(只是为了保持一致,并且仍然可以在同一个数据上下文中调用我的过程)。
我致电this.Connection.CreateCommand()
,将其投放到SqlCommand
(因为无论如何它都会SqlCommand
支持TVP),手动列出所有参数,包括SqlDbType.Structured
个参数,和ExecuteNonQuery
它。
这很好用
但是,
在我的帮助方法中,我必须打开上下文连接,因为它可能已关闭。 因为我手动打开连接,是否必须手动关闭它?
我经历过这些:
Do I have to close the SQL Connection manually if I use Linq?
When should I dispose of a data context
When the connection to database starts if i use 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
管理其生命周期,或者是否有可以遵循的模式?
修改
实验表明,如果我只是将其打开,它表现良好并自动尊重环境事务(如果有的话)。但是,我更希望得到一个可靠的建议。
答案 0 :(得分:-1)
如果您不需要分布式事务,请避免使用System.Trasactions。相反,请参阅我的TextMetal项目,示例代码,并注意Plumbing命名空间。如果您有任何疑问,请给我发电子邮没有MSDTC轻微的手,只是正确生成ADO.NET/LINQ到SQL,一个工作模式单元,以及一些精心设计的数据访问代码!
如果有令人信服的理由使用System.Transactions,那么我建议您尽快关闭连接,因为事务协调器将在连接释放到池后管理提交/回滚。