繁体   English   中英

EntityFramework自动创建多对多关系

[英]EntityFramework creating many-to-many relationships automatically

实体框架是否自动创建多对多关系?

我在下面尝试:

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及其相互之间的外键关联。 问题在于这些表没有被规范化并且具有冗余数据。 另外,当尝试在“团队”表中查询成员时,我总是得到一个空的成员列表!

例如,“用户”有一个“团队ID”列,因此添加到团队中时会创建一个新的“用户”记录,这很糟糕!

实体框架是否不应该自动创建多对多关系表? 使其具有列| UserID | SportID | TeamID |

用户有一个列Team_ID

这是问题所在。 EF在用户表中创建了一个列,因为您告诉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列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM