我扩展了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");
}
}
}
更新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]
我只想获得所有用户及其角色的列表。
答案 0 :(得分:1)
User.Roles
不是Role对象的集合。 “角色用户”是一种多对多关系,因此在“用户”和“角色”之间,IdentityUserRoles
表只有两列:UserId
和RoleId
- 这正是您的意思接。这不是因为您已重命名表 - 这是默认情况。
要获取用户的角色对象 - 获取此用户的所有RoleId,然后使用提供的ID获取所有角色。
答案 1 :(得分:0)
在您的用户模型中,您可以指定角色集合,在角色模型中,您可以指定用户集合。这应该创建导航属性。
例如:
public class User{
ICollection<Role> Roles {get; set;}
}
并且
public class Role{
ICollection<User> Users {get; set;}
}
然后您可以使用显式或急切加载来根据需要加载角色。