用户角色未在customroleprovider中更新实体框架

时间:2012-03-12 22:08:59

标签: asp.net-mvc entity-framework

我有一个应用程序,用户和角色之间有以下关系:

modelBuilder.Entity<User>()
                .HasMany(c => c.Roles)
                .WithMany(p => p.Users)
                .Map(
                   m => {
                       m.MapLeftKey("UserId");
                       m.MapRightKey("RoleId");
                       m.ToTable("UserRole");
                   });

非常标准的东西。我有一个customRoleProvider设置如下:

    public class CustomRoleProvider : RoleProvider
        {
            private readonly IUnitOfWork _unitOfWork;

            public CustomRoleProvider()
            {
                _unitOfWork = DependencyResolver.Current.GetService<IUnitOfWork>();
            }

            public CustomRoleProvider(IUnitOfWork unitOfWork)
            {
                _unitOfWork = unitOfWork;
            }

...

            public override string[] GetRolesForUser(string username)
            {
                var user = _unitOfWork.UserRepository.GetUser(username);

                var roles = from r in user.Roles
                            select r.Name;

                if (roles != null)
                    return roles.ToArray();
                else
                    return new string[] { };
            }

            public override bool IsUserInRole(string username, string roleName)
            {
                var user = _unitOfWork.UserRepository.GetUser(username);

                var roles = from r in user.Roles
                            select r.Name;

                return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
            }
    ...

        }

这似乎工作正常,并返回角色确定异常。如果您通过以下内容添加角色:

user.Roles.Add(role);

            _db.SaveChanges();

在重新启动不合适的应用程序之前,代码找不到新角色。

通过一些实验,我发现如果我在需要时实例化unitOfWork,就会找到完整的角色列表:

public override string[] GetRolesForUser(string username)
            {
                  **var unitOfWork = new UnitOfWork();**

                var user = unitOfWork.UserRepository.GetUser(username);

                var roles = from r in user.Roles
                            select r.Name;

                if (roles != null)
                    return roles.ToArray();
                else
                    return new string[] { };
            }

但我真的不想这样做。

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

检查您是否在用户的cookie中缓存了您的角色。尝试将cacheRolesInCookie="false"添加到web.config

的roleManager节点