外键 - 多对多(实体框架)中的定义?

时间:2015-04-09 14:07:40

标签: c# entity-framework

因为我不喜欢命名约定,所以entityFramework(代码优先)使用我通常使用foreignKey属性来分配我自己的属性:

public class User {
   public virtual Customer Customer { get; set; }
   [ForeignKey("Customer")]
   public Guid CustomerId { get; set; }
}

工作正常,在“用户”-Table中创建了一个“CustomerId”列。

但是,当我需要多对多的关系时,我如何实现同样的目标?

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

public class Role {
   public virtual ICollection<User> Users { get;set; }
}

这会产生一个表“UserRole”,其中包含“User_id”和“Role_Id”。

不过,我更喜欢“UserId”和“RoleId”。我可以自己创建一个UserRole-Class,其中包含对User和Role的引用,但应该有更优雅的方式。有没有?

1 个答案:

答案 0 :(得分:2)

您可以使用Fluent Api在您的上下文中配置多对多关系,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

   modelBuilder.Entity<User>()
               .HasMany<Role>(u => u.Roles)
               .WithMany(c => c.Users)
               .Map(cs =>
                        {
                            cs.MapLeftKey("UserId");
                            cs.MapRightKey("RoleId");
                            cs.ToTable("UserRoles");
                        });

}

这样,您可以使用所需的名称命名联结表和FK列。

另一种方法是创建一个表示联结表的实体,并与UserRole建立两个一对多的关系,但如果您不需要添加额外的列,联结表,建议使用第一个变体,但您可以在此表中明确地找到一些advantages