重命名身份表并维护关系

时间:2015-01-23 21:01:36

标签: linq asp.net-identity asp.net-identity-2

我扩展了IdentityDBContext以重命名表名,但看起来我失去了用户和角色之间的多对多关系。 LINQ没有再找到正确的关系(请参阅intellisence屏幕截图):

namespace Carbon.Models {
    public partial class CarbonEDM :  IdentityDbContext<User, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>{
        public CarbonEDM()
            : base("name=CarbonDB") {
        }

        public DbSet<Message> Messages { get; set; }


        public static CarbonEDM Create() {
            return new CarbonEDM();
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder) {

            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<User>().ToTable("Users", "dbo");
            modelBuilder.Entity<Role>().ToTable("Roles", "dbo");
            modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles", "dbo") ;
            modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims", "dbo");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins", "dbo");

        }
    }
}

enter image description here

更新1

如答案所示,Identity角色模型上没有导航属性,所以我尝试了以下内容:

    var users = from usr in db.Users
                select new UserInfoViewModel{
                    email = usr.Email,
                    name = usr.Name,
                    role_name = db.Roles.Find(usr.Roles.FirstOrDefault().RoleId).Name
                };

但是我仍然犯了另一个错误: Method 'Carbon.Models.Role Find(System.Object[])' declared on type 'System.Data.Entity.IDbSet 1 [Carbon.Models.Role]&#39;无法使用类型&System; System.Data.Entity.Core.Objects.ObjectQuery 1[Carbon.Models.Role]

的实例调用

我只想获得所有用户及其角色的列表。

2 个答案:

答案 0 :(得分:1)

User.Roles不是Role对象的集合。 “角色用户”是一种多对多关系,因此在“用户”和“角色”之间,IdentityUserRoles表只有两列:UserIdRoleId - 这正是您的意思接。这不是因为您已重命名表 - 这是默认情况。

要获取用户的角色对象 - 获取此用户的所有RoleId,然后使用提供的ID获取所有角色。

答案 1 :(得分:0)

在您的用户模型中,您可以指定角色集合,在角色模型中,您可以指定用户集合。这应该创建导航属性。

例如:

public class User{

ICollection<Role> Roles {get; set;}

}

并且

public class Role{

ICollection<User> Users {get; set;}

}

然后您可以使用显式或急切加载来根据需要加载角色。

相关问题