EntityFramework自动创建多对多关系

时间:2016-05-06 00:50:34

标签: c# asp.net-mvc entity-framework

Entity Framework是否会自动创建多个关系,如果是,如何创建?

我正在尝试以下内容:

public DbSet<User> Users { get; set; }
public DbSet<Sport> Sports { get; set; }
public DbSet<Team> Teams { get; set; }
  • 我有很多运动
  • 我有很多运动队
  • 我的团队中有很多用户

类:

运动

public int ID { get; set; }
public List<Team> Teams { get; set; }

public int ID { get; set; }
public List<User> Members { get; set; }
public int SportID { get; set; }

用户

 public int UserID { get; set; }

问题:

因此,它创建表Users,Sports,Teams与他们的外键关联彼此。问题是这些表没有规范化并且具有冗余数据。此外,当尝试查询Teams表中的成员时,我总是得到一个空的成员列表!

例如,用户有一个Team_ID列,因此当它添加到一个糟糕的团队时会创建一个新的用户记录!

不是实体框架会自动创建多对多关系表吗?所以它有列| UserID | SportID | TeamID |

1 个答案:

答案 0 :(得分:0)

  

用户有一个Team_ID列

这是问题所在。 EF在User表中创建了一个列,因为您告诉EF这样做。你应该多对多。

public class User
{
   public int UserId { set;get;}
   public ICollection<Team> Teams { set; get; }
}
public class Sport
{
    public int Id { set; get; }
    public string Name { set; get; }
    public IEnumerable<Team> Teams { set; get; }
}

public class Team
{
    public int TeamId { get; set; }
    public List<User> Users { get; set; }
    public int SportId { set; get; }
}

现在使用流畅的配置,您可以指示EF为多对多关系创建联结表。您可以在dbcontext类的OnModelCreating方法中执行此操作。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
                .HasMany(d => d.Teams)
                .WithMany(f => f.Users)
                .Map(w => w.ToTable("UserTeam")
                           .MapLeftKey("UserId")
                           .MapRightKey("TeamId"));

}

这将在User和Team之间建立多对多的关系,并创建第四个具有UserId和TeamId列的表。