【问题标题】:Custom RoleProvider keeps caching my repository object自定义 RoleProvider 不断缓存我的存储库对象
【发布时间】:2012-02-09 16:13:08
【问题描述】:

我已经为一个项目实现了一个自定义 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 函数中创建存储库时,它工作正常。

是否存在缓存问题?谁能帮帮我。

【问题讨论】:

  • 您如何以及在何处更改用户角色?
  • 我直接在数据库中添加或删除角色。
  • 所以,看看我的回答,你就会明白,如果没有,告诉我你不明白的地方。 =)

标签: asp.net-mvc entity-framework roleprovider


【解决方案1】:

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

【讨论】:

  • 谢谢!我通过将EntityDB _db = new EntityDB(); 放在GetRolesForUser 方法中来修复它。你的建议更优雅:)
  • @jpderooy 不要忘记将EntityDB _db = new EntityDB(); 困在using 块内。您可以将此标记为已接受的答案。
【解决方案2】:

问题是上下文引用。当您创建上下文(EntityDB)的引用时,在从您的上下文中获取角色的方法中,此引用仍然相同,换句话说,您选择的每个数据都将是相同的,因为选择将在不在数据库中的上下文(这是 EF 不会一直进入数据库的一种方式)。您所做的更改(在角色中)是在另一个上下文中进行的,因此要获得正确的上下文,您必须创建上下文的新实例。使用以下键在方法内部执行此操作:

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

【讨论】:

  • 感谢您的澄清!
  • 好吧,如果它有用,您可以投票以帮助有同样问题的其他人。不管怎样,随时欢迎你! =)
  • 我是这里的新手,所以我必须赢得更多声望才能投票;)
  • 谢谢!所以,让我们在这里了解更多,并传递知识! =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多