我是TransactionScope的新手。我只是想确保我在做什么在下面的代码中是正确的。
private void DoSomeWork()
{
using (var context = new MyEntities())
using (TransactionScope scope = new TransactionScope())
{
context.Connection.Open();
int ID = context.CallUpdateStoredProc();
RecursiveDelete((EntityConnection)context.Connection, ID);
context.Connection.Close();
scope.Complete();
}
}
private void RecursiveDelete(EntityConnection connection,int someID)
{
using (var context = new MyEntities(connection))
{
var UpdatedLinks = context.CallSaveStoredProc(someID).ToList();
foreach (int UpdatedLink in UpdatedLinks)
{
RecursiveDelete(connection,UpdatedLink);
}
}
}
答案 0 :(得分:0)
实体框架4可识别TransactionScope,因此您的示例将正常工作。请参阅this example on MSDN。
答案 1 :(得分:0)
就你如何使用TransactionScope
class而言,是的,这是正确的,你通常使用以下模式:
// Use overloads of constructor if you need to fine-tune the transaction
using (var tx = new TransactionScope())
{
// Do your work.
// Call Complete if the work is truly complete.
// Note, if you determine through logic, you don't
// have to call Complete.
tx.Complete();
}
调用Complete
method后,它会指示即将提交的临时数Transaction
。请注意,在调用Complete
时未提交事务,但在TransactionScope
被处置时提交。
来自TransactionScope.Complete
的文档:
资源管理器之间的实际提交工作发生在 如果TransactionScope对象创建了,则结束使用语句 事务。
此外,如示例代码中的注释所示,我们有意识地决定是否应该调用Complete
。
再次,从TransactionScope.Complete
的文档(强调我的):
当您满意时,范围内的所有操作都是 成功完成后,您应该只调用此方法一次 告知事务管理器所有资源的状态是 一致,并且可以提交交易。
现在,关于TransactionScope
是否可以与实体框架一起使用,答案是肯定的,因为MSDN上的文档标题为"How to: Manage Transactions in the Entity Framework"表示。