实体框架数据库首先是多对多的

Spo*_*ook 5 c# sql database many-to-many entity-framework

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

EF创建UserRole实体与UserRoles导航属性在User实体和Role实体,但我宁愿RolesUserUsersRole.这是否可以通过模型设计师设计?如何手动配置中间表的多对多关系?

Raj*_*dar 10

如果UserRole表包含除User和Role表的外键之外的列,则EF通常会创建中间模型.

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

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

如果您没有任何非键列,不想再修改数据库,并且不需要在模型中使用此中间表,则可以手动修改OnModelCreating,以指定Many-to - 很多并隐藏中间表.

以下是所有步骤:

  1. 从模型层中删除中间表定义C#类,并在DbContext和User和Role类中删除它们.
  2. 在User和Role类中为彼此添加虚拟Collection属性.

例如在User类中,

public virtual ICollection<Role> Roles { get; set; }
Run Code Online (Sandbox Code Playgroud)

并在User构造函数中

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"); 
                                   });
Run Code Online (Sandbox Code Playgroud)

  • 我认为包括数据库结构是不必要的,因为我做了最标准的多对多关系。然而,它似乎有很大帮助,因为我在中间表中包含了“Id”列。当我删除它时,EF 确实发现了多对多关系。谢谢! (2认同)