5

問題。在註冊方案中,我試圖在用戶表中插入一個用戶,然後爲該用戶調用WebSercurity.CreateAccount(在一個事務中)。這會導致MS DTC在服務器上不可用的錯誤。使用具有在TrasactionScope其​​他查詢WebSercurity.CreateAccount,而不DTC啓用

Description。我這樣做的原因是因爲我有一個Customer實體,它繼承自User,所以WebSercurity.CreateUserAndAccount不能使用,因爲它不知道約Customer,只是插入User記錄。

我使用Asp.net MVC 4的EntityFramework 5,CodeFirst,和SQL Server 2008 R2。

任何建議不使用DTC將不勝感激!

編輯。 這是顯而易見的,爲什麼這個錯誤發生,因爲websecurity使用它自己的數據庫連接,我的倉庫使用其他連接,雖然我已經配置simplemembership使用相同DbContext類作爲我的資料庫,但問題是它創建了一個在DbContext的新實例...

我希望如果有通過現有上下文對象,或連接到WebSecurity它的方法使用的方式。

下面的代碼:

 if (ModelState.IsValid) 
     { 
      //using (TransactionScope tx = new TransactionScope()) 
      //{ 
       UnitOfWork.UserRepository.Insert(new Customer 
       { 
        FirstName = model.FirstName, 
        LastName = model.LastName, 
        Email = model.Email, 
        Tel = model.Tel, 
        Mobile = model.Mobile, 
        BirthDate = model.BirthDate, 
        InsertDate = DateTime.Now, 
        UserType = UserType.Customer, 
        MaritalStatus = model.MaritalStatus, 
        ZipCode = model.ZipCode, 
        StreetAddress = model.StreetAddress, 
        City = model.City, 
        State = model.State 
       }); 
       UnitOfWork.Commit(); 

       string token = WebSecurity.CreateAccount(model.Email, model.Password, true); 

       Roles.AddUserToRole(model.Email, "Customer"); 
       //WebSecurity.Login(model.Email, model.Password, true); 

       await Task.Run(() => EmailHelper.SendConfrimationEmail(token, model.Email)); 

      // tx.Complete(); 
      //} 

回答

1

我發現了一個可能的解決方案,但我不知道這是否是最好的解決辦法。這個想法來自於這個blog post,它說我們如何在我們的POCO實體中包含簡單成員表並且自己創建表(不使用WebSecurity)。

因此,作爲一個結果,我想我可以簡單地通過webpages_UsersInRoles表中插入一條記錄插入在webpages_Membership表中的記錄,並AddUserToRole實現我的倉庫中CreateAccount方法。 對於其他查詢,如GetUser和...我們可以像以前一樣使用WebSecurityRoles類。

看來工作正常(否則我想的東西),但有一些額外的工作要做,我希望不要!

所以如果有人能給我一個更好的解決方案,我會很高興。

1

的DTC錯誤的發生是因爲你正試圖跨越兩個不同的數據庫連接的事務。你有幾個選擇。

SimpleMembership設計用於簡單場景。你正在做一個高級場景,所以你應該使用不同的會員供應商。

+0

謝謝,是的,我知道,是不是有辦法通過連接到'WebSecurity'方法? 你有什麼建議會員供應商? – Ashkan 2013-02-22 01:19:54

0

由於Mystere Man指出錯誤發生是因爲事務處理了兩個不同的數據庫。你有幾個選擇。這裏有一些想到的。

您可以自定義使用的SimpleMembership提供商捕捉你想爲每個用戶定製信息的現有用戶實體。這是相當簡單的,並且是discussed in this blog post。它看起來像你正在嘗試做的電子郵件確認該SimpleMembership供應商也支持並discussed here

您也可以使用唯一的用戶ID(INT),其SimpleMembership使用配合你的其他數據庫中的信息。一旦創建了用戶和日誌他們可以通過調用WebSecurity.CurrentUserId獲得該ID。

您可以繞過整個SimpleMempership提供商,並創建自己的自定義成員資格提供,這是discussed here

+0

謝謝你的回答。 關於**選項1 **:我正在使用這種方法。我的用戶實體有我需要的自定義信息,我的問題是我有兩種類型的用戶:客戶和代理繼承用戶!關於**選項2 **的 **:我也在做這個!我的問題是別的(或者我沒有明白你的觀點!)。但鏈接有一些有用的信息。謝謝。 和約**選項3 **:我不想重新發明輪子。 – Ashkan 2013-02-22 21:39:51

相關問題