2012-03-15 52 views
2

我想設置一個事務,其中我的代碼使用成員資格提供程序創建一個新用戶,然後繼續創建一個對象並將其放入我的實體框架表。如果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(); 

回答

0

至於你說了,即使u使用兩個EF和成員相同的連接字符串,他們使用不同的連接,則交易範圍內自動升級到DTC

而且據我知道使用這兩種

是不可能相同的連接把一個自定義連接到SqlMembershipProvider的

根據this link

避免涉及DTC

相關問題