2015-12-21 64 views
16

有誰知道如何在實體框架7中創建顯式事務? 我找到的所有信息都是指EF的第6版。文檔也很不完整,所以有人可以提供一個例子嗎?實體框架中的顯式事務7

我有一個dbContext,我必須刪除一個實體和它的相關對象,然後再次插入它們,但是在同一個事務中,所以我總是會有一個「版本」的行。

+0

你可以在你想使用事務的地方包含小代碼片段嗎?你有'dbContext'或'DbCommand'嗎?通常應該使用'using(context.Database.BeginTransaction()){.../*做某事*/...}',但可以使用'await context.Database.BeginTransactionAsync()'來代替。可以使用'var transaction = context.Database.BeginTransaction()){...}'並顯式調用'transaction.Commit()'來提交事務或調用'transaction.Rollback()'來回滾。有更奇特的[EnlistTransaction](https://msdn.microsoft.com/en-us/library/ms254973(v = vs.110).aspx)。 – Oleg

+0

沒有那麼奇特...尚;-)所以,字節是相同的比在EF6?然後我錯過了一些東西。我有一個dbContext,我必須刪除一個實體和它的相關對象,然後再插入它們。 – Vi100

+0

好的,你的代碼工作,但它與EF6相同。你介意我是否刪除了這個問題,或者更喜歡我編輯它,並將你的評論發佈爲答案? – Vi100

回答

14

EF7中只包含交易功能(參見the statement)。撥打.SaveChanges()(或.SaveChangesAsync())應使用自動交易。然後我想,例如,某些實體項目的狀態應在之前標記爲已刪除。

人們可以通過內部的

using (context.Database.BeginTransaction()) { 
    /*do something*/ 
} 

該交易將通過在using塊結束的.Dispose()呼叫致力於纏繞操作的一些片段的數據庫上顯式啓動事務。人們可以選擇使用

using (var transaction = await context.Database.BeginTransactionAsync()) { 
    /*do something*/ 
    /*one can call 
     transaction.Rollback() or transaction.Commit() 
     explicitly in the code */ 
} 

它一般都應該看起來像以前版本的實體框架。例如見the post

+0

這不是RC-1的最終版本,需要更新版本的DatabaseFacade。 – user764754

+0

@ user764754:你確認了嗎?看看RC1中包含的[測試](https://github.com/aspnet/EntityFramework/blob/7.0.0-rc1/test/EntityFramework.Relational.FunctionalTests/TransactionTestBase.cs#L62)。它使用'BeginTransaction()' – Oleg

+0

在RC-1中它是EntityFramework.Relational中的擴展方法。後來在EntityFramework.Core中使用DatabaseFacade。我只提到核心RC-1,這就是爲什麼我沒有找到它。 – user764754