我想設置一個事務,其中我的代碼使用成員資格提供程序創建一個新用戶,然後繼續創建一個對象並將其放入我的實體框架表。如果EF操作失敗,我希望能夠在創建用戶之前回滾到。我有EF和成員資格的單個連接字符串,所以我認爲這兩個操作應該使用相同的SQL連接。首先使用TransactionScope與實體框架代碼和通用提供商
當我第一次運行它,我得到一個
「MSDTC在服務器上...不可用。」
Membership.CreateUser行異常。當我開始DTC服務,我得到一個
「基礎提供失敗的開放」
異常與內部異常
「的操作是無效的狀態的交易。「
在同一行上。如果我更改順序並先執行EF保存,然後執行成員資格,則EF部分將工作,但CreateUser將失敗,並具有相同的例外情況。
看起來好像2個SQL連接正在使用,即使我有一個連接字符串。有沒有辦法強制成員資格和EF操作使用相同的連接,或者有其他方式將其放入事務中?
下面的代碼
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
MembershipCreateStatus createStatus;
MembershipUser user = Membership.CreateUser(model.UserName, model.Password, model.UserName, null, null, true, null, out createStatus);
//add objects to the DbContext db
db.SaveChanges();
scope.Complete();