【问题标题】:Renaming Identity Tables and Maintaing Relationship重命名身份表和维护关系
【发布时间】:2015-01-23 21:01:35
【问题描述】:

我扩展了 IdentityDBContext 以重命名表名,但看起来我失去了用户和角色之间的多对多关系。 LINQ 不再选择正确的关系(p.s. 见智能截图):

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

正如答案所建议的,身份角色模型没有导航属性,所以我尝试了以下方法:

    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.IDbSet1[Carbon.Models.Role]' 无法使用类型为“System.Data.Entity.Core.Objects.ObjectQuery1[Carbon.Models.Role]”的实例调用

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

【问题讨论】:

  • UserInfoViewModel 是什么样的?这就是users 的通用 argumnet 的类型(您也可以将鼠标悬停在 VS 中的 var 上,让编译器提醒您该类型)。

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


【解决方案1】:

User.Roles 不是角色对象的集合。用户到角色是多对多的关系,因此在用户和角色之间有 IdentityUserRoles 表,它只有 2 列:UserIdRoleId - 这正是您要选择的。这不是因为您已重命名表 - 这是默认情况下的。

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

【讨论】:

  • 是的,但不应 linq 自动检测与中间表的多对多关系,例如 entityframeworktutorial.net/EntityFramework4.3/…,并为 User.Roles 而不是中间表提供集合
  • Identity 不提供这些导航属性。这就是它的编码方式。我相信这样做是为了让 Identity 可以与许多不同的持久性技术一起使用,而不仅仅是 EF。
  • @trailnax 我更新了问题,仍然无法通过正常的 ef 查询获得具有角色的用户列表
  • 同样对于背景,当我们在两个方向都有导航属性时,会有一些非常严重的性能影响,因为不仅加载了所有用户的角色,而且还加载了每个角色中的所有用户.在 2.2/3.0 中,出于性能原因,我们不再使用导航属性并直接查询
【解决方案2】:

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

例如:

public class User{

ICollection<Role> Roles {get; set;}

}

还有

public class Role{

ICollection<User> Users {get; set;}

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多