我有一些场景,我需要在datacontext上多次调用.SubmitChanges(),但我想自己显式控制事务以使其成为原子。有一段时间我一直在这样做,创建一个连接,在该连接上创建一个事务,然后创建datacontext并传递它们。让我们假设现在我不想使用TransactionScope。我的代码如下所示:
Using conn As New SqlConnection("connection string...")
conn.Open()
Using trans = conn.BeginTransaction()
Dim dc as new DataContext(conn)
dc.Transaction = trans
' do some work
trans.Commit()
End Using
End Using
我开始使用Linq To SQL分析器,它破坏了这段代码。出于某种原因,它们要求您使用datacontext上的.Connection属性来创建事务。如果直接使用连接变量(我认为这很愚蠢),它会失败。我的问题是,这样做是否更合适:
Using conn As New SqlConnection("connection string...")
conn.Open()
Dim dc as new DataContext(conn)
Using trans = dc.Connection.BeginTransaction()
dc.Transaction = trans
' do some work
trans.Commit()
End Using
End Using
这是更广泛接受的方式吗?
答案 0 :(得分:0)
第二个片段对我来说似乎不合适。使用第二个代码片段,您需要在创建上下文之后创建事务,这至少 - 从可读性/可维护性角度来看不太有用。我试着想象一下,当你需要创建两个DataContext
类时,代码会是什么样子,并在创建第一个上下文后创建事务(仅限)。这使得保持干净的分离代码非常困难。
我认为您应该发送邮件给Hibernating Rhinos并询问他们是否修复了这个错误。
答案 1 :(得分:-1)
Product prod = db.Products.Single(p => p.ProductID == 15);
if (prod.UnitsInStock > 0)
prod.UnitsInStock--;
using(TransactionScope ts = new TransactionScope()) {
db.SubmitChanges();
ts.Complete();
}
答案 2 :(得分:-1)