2011-04-28 101 views
3

希望你的某個人一直在那裏。我需要做一些涉及多個表的數據庫。我正在使用SubSonic 3 SimpleRepository更新/訪問記錄。現在在調用更新表之間,我打電話System.Web.Security.Roles方法來做一些查找。我正在使用單個存儲庫對象來完成DAO上的所有更新,但是當我的代碼到達User.IsInRole("blahblah")時,它會拋出異常MSDTC is not available on the server交易和ASP.NET成員資格API

我知道這是因爲SimpleRepository正在使用不同的連接而Membership API對象正在使用另一個連接。

有沒有辦法繞過它,或者我必須在自己的類中包裝Membership API對象?

回答

1
  • 您可以配置成員/角色提供者以使用您需要的連接字符串。

  • 您可以繼承這個提供者的任何一個或多個事務範圍的每個方法的調用,從外部控制。

+1

與連接字符串配置它們不會使用SqlConnection對象上的任何影響,以連接到數據庫。 SubSonic和Membership API正在創建不同的SqlConnection對象。 – 2011-04-29 06:12:21

+0

繼承路由是方式,但我必須做額外的工作:D暫時我正在使用存儲過程,但會編寫一組類來包裝供應商調用以供將來使用。 – TheVillageIdiot 2011-05-04 04:53:01

0

HttpContext.Current.User.IsInRole()電話RolePrincipal.IsInRole()用於通過FormsAuthentication驗證的用戶。內部RolePrincipal.IsInRole()調用SqlRoleProvider.GetRolesForUser(),該方法創建並銷燬方法中的SqlConnection對象。

有可能是SQL Server上的其他解決方案來解決這個問題,但是從籬笆我只看到下列選項的.NET方面:

  • 實現你自己的角色提供這樣就可以管理自己連接到數據庫。
  • 實現您自己的IPrincipal對象,以便您可以自行管理與數據庫的連接。
  • 在開始您的SubSonic交易前預先獲取角色,並根據需要檢查相關角色的列表。
  • 您甚至可能不需要存儲角色,因爲RolePrincipal.IsInRole()會在調用角色時緩存角色,並且只有在緩存爲空或無效時才發送到數據庫。在開始交易之前調用IsInRole()將預先填充RolePrincipal對象的緩存,這意味着在SubSonic事務中間的後續調用將從緩存中提取角色,而不是連接到數據庫以獲取它們。

我真的不相信最後的想法是好的,因爲我確信有很多方法可能會出錯。我認爲最簡單的解決方案是在開始SubSonic交易之前預先獲取角色。

我希望有幫助。

編輯:爲了完整起見,這裏是RolePrincipal.IsInRole()執行情況的反射看到:

public bool IsInRole(string role) 
{ 
    if (this._Identity == null) 
    { 
     throw new ProviderException(SR.GetString("Role_Principal_not_fully_constructed")); 
    } 
    if (!this._Identity.IsAuthenticated || (role == null)) 
    { 
     return false; 
    } 
    role = role.Trim(); 
    if (!this.IsRoleListCached) 
    { 
     this._Roles.Clear(); 
     foreach (string str in Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name)) 
     { 
      if (this._Roles[str] == null) 
      { 
       this._Roles.Add(str, string.Empty); 
      } 
     } 
     this._IsRoleListCached = true; 
     this._CachedListChanged = true; 
    } 
    return (this._Roles[role] != null); 
}