48

我想知道用DBContext實現交易的最佳方式是什麼。特別是,EF Code First DBContext and Transactions

  1. 是否DbContext.SaveChanges實現交易內部如果我改變多個實體?
  2. 如果我想多次撥打DbContext.SaveChanges(同一個contxet /不同的contxets),如何實現交易?

回答

71
  1. 是的。 SaveChanges內部使用事務。
  2. 使用TransactionScope包裹多次調用SaveChanges

例子:

using(var scope = new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
{ 
    // Do something 
    context.SaveChanges(); 
    // Do something else 
    context.SaveChanges(); 

    scope.Complete(); 
} 
+5

一定要使用SQL 2008或更高版本的數據庫(或有MSDTC服務的客戶端上運行)。以前的版本會將事務升級爲第二個'SaveChanges'上的分佈式事務。這是由於'DbContext'如何在內部處理其連接的打開和關閉。 – Lukazoid 2012-01-19 15:51:46

+0

是否可以從第一次保存更改中獲取身份?我總是看到Id = 0. – JarrettV 2012-01-24 17:11:03

+0

@JarrettV - 我認爲你的問題是因爲IsolationLevel設置。降低它可能會有幫助... – Sunny 2012-03-12 17:00:39