2012-02-09 89 views
3

我爲項目實現了一個自定義RoleProvider。 RoleProvider可以工作,但用於獲取用戶角色的存儲庫僅在構建後纔會填充。當我登錄時,更改用戶的角色,再次登錄,用戶仍然保留舊角色。自定義RoleProvider不斷緩存我的存儲庫對象

public class CmsRoleProvider : RoleProvider 
{ 
    private EntityDB _db { get; set; } 

    public CmsRoleProvider() 
    { 
     _db = new EntityDB(); 
    } 

    public override string[] GetRolesForUser(string username) 
    { 
     var user = _db.Users.Where(u => u.EmailAddress == username).SingleOrDefault(); 
     var roles = user.UserRoles.Select(u => u.Role.Name).ToList<string>(); 

     return roles.ToArray(); 
    } 
} 

在上面的示例中,用戶在構建項目後只獲取正確的角色。當我在GetRolesForUser函數中創建存儲庫時,它工作正常。

是否存在緩存問題?誰可以幫助我。

+0

如何以及在哪裏更改用戶角色? – 2012-02-09 16:17:35

+0

我直接在數據庫中添加或刪除角色。 – jpderooy 2012-02-09 16:29:25

+1

所以,請看我的回答,你會明白,如果沒有,告訴我你不明白。 =) – 2012-02-09 16:36:16

回答

7

ASP.NET僅創建RoleProvider的單個實例。因爲你的語境也很長壽。最好有短暫的環境。

public class CmsRoleProvider : RoleProvider 
{   
    private EntityDB GetContext() 
    { 
     return new EntityDB(); 
    } 

    public override string[] GetRolesForUser(string username) 
    { 
     using(var db = GetContext()) 
     { 
      var user = db.Users.Where(u => u.EmailAddress == username) 
          .SingleOrDefault(); 
      var roles = user.UserRoles.Select(u => u.Role.Name).ToList<string>(); 

      return roles.ToArray(); 
     } 
    } 
} 

問題與您的方法是上下文跟蹤加載的用戶。當你要求一個已經被上下文跟蹤的用戶時,返回現有的實例。因此返回與之相關的UserRoles

+0

謝謝!我通過在'GetRolesForUser'方法內放入'EntityDB _db = new EntityDB();'來解決它。您的建議更優雅:) – jpderooy 2012-02-09 16:32:12

+1

@jpderooy不要忘記將'EntityDB _db = new EntityDB();'置於'using'塊中。您可以將其標記爲接受的答案。 – Eranga 2012-02-09 16:35:13

+0

感謝您的快速回答! – jpderooy 2012-02-09 16:42:38

2

問題是上下文引用。當您創建上下文的引用(EntityDB)時,在從上下文獲取角色的方法之外,這個引用仍然是相同的,換句話說,您選擇的每個數據都將是相同的,因爲選擇將在上下文不在數據庫中(這是EF不會一直到數據庫的一種方式)。你在(在角色中)做的改變是在另一個上下文中進行的,所以爲了獲得正確的上下文,你必須創建一個新的上下文實例。在使用keywork的方法中使用:

using (var database = new EntityDB()) 
{ 
    // Get your roles and return them 
} 
+0

感謝您的澄清! – jpderooy 2012-02-09 16:44:20

+0

那麼,如果它有用,您可以投票支持具有相同問題的其他人。無論如何,隨時歡迎你! =) – 2012-02-09 16:47:24

+0

我在這裏是一個新手,所以我必須贏得更多的聲望投票了;) – jpderooy 2012-02-09 16:55:39