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

时间:2016-02-20 18:18:43

标签: c# sql database entity-framework many-to-many

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

EF在UserRole实体和UserRoles实体中创建了User实体和Role导航属性,但我宁愿Roles位于UserUsers中有1}}和Role。这是否可以通过模型设计师设计?如何手动配置中间表的多对多关系?

1 个答案:

答案 0 :(得分:8)

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

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

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

如果您没有任何非键列,不想再修改数据库而不需要模型中的这个中间表,您可以手动修改OnModelCreating,以指定多对多并隐藏中间表。

以下是所有步骤:

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

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

    并在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"); 
                                       });