Entity Framework 数据库优先多对多

Entity Framework Database First many-to-many

我已经从数据库创建了一个 Entity Framework 模型。我有多对多关系:User - UserRole - Role

EF 在 User 实体和 Role 实体中创建了 UserRole 实体和 UserRoles 导航 属性,但我宁愿 [= User 中的 18=] 和 Role 中的 Users。是否可以通过模型设计器进行设计?如何手动配置中间有一个 table 的多对多关系?

如果 UserRole table 包含用户和角色 table 的外键以外的列,EF 通常会创建中间模型。

因此,如果您在 UserRoles table 中只有 2 列,用户和角色的外键 tables(甚至不是代理键),EF 将根据需要创建模型. (没有任何中间模型)因此,这是自动生成所需行为的一种方法。 table.

中只有 2 列

但是如果你在这个 table 中有其他非键列(数据),那么 EF 所做的是正确的。您需要中间实体。

并且在您没有任何非键列的情况下,不想再修改您的数据库并且在您的模型中不需要这个中间 table,您可以手动修改OnModelCreating,指定Many-to-Many并隐藏中间table.

以下是所有步骤:

  1. 从模型层删除中间 table 定义 C# class,以及它在 DbContext 和 User 和 Role classes 中的引用。
  2. 在用户和角色 class 中为彼此添加一个虚拟集合 属性。

例如在用户 class,

public virtual ICollection<Role> Roles { get; set; }

并且在用户构造函数中

this.Roles = new HashSet<Role>();

// on the OnModelCreating method, add this snippet
modelBuilder.Entity<User>().HasMany<Role>(u => u.Roles)
                          .WithMany(r => r.Users)
                          .Map(ru => 
                                   {  
                                     ru.MapLeftKey("UserId");        
                                     ru.MapRightKey("RoleId"); 
                                     ru.ToTable("UserRole"); 
                                   });