Entity Framework Core 2.0多对多关系相同的表

时间:2018-04-15 07:13:26

标签: c# entity-framework-core

我正在使用 Entity Framework Core 2.0 来映射存在的数据库,数据库有两个表:TeamsSupportTeam

团队字段: ID,名称

TeamSupport :TeamID(Team Table上的ForeignKey),SupportTeamID(Team Table上的ForeignKey)

我尝试将它们映射如下:

 public class Team
 {
     public int Id { get; set; }
     public string name { get; set; }

     public List<TeamSupport> SupportTeams { get; set; }

 }

 public class TeamSupport
 {
     public int TeamId { get; set; }
     public virtual Team Team { get; set; }

     public int SupportTeamId { get; set; } // In lack of better name.
     public virtual Team SupportTeam { get; set; }
 }

但是当我运行“add-migration”时,我遇到了以下错误:

  

无法确定导航所代表的关系   'List'类型的属性'Team.SupportTeams'。或   手动配置关系,或使用。忽略此属性   '[NotMapped]'属性或使用'EntityTypeBuilder.Ignore'   'OnModelCreating'。

1 个答案:

答案 0 :(得分:1)

TeamSupport实体具有两个 参考导航属性Team(定义了{{1}之间的两个多对一关系}和TeamSupport),但Team实体只有一个 集合导航属性,因此EF不知道如何映射它(到{ {1}}或Team)并抛出有问题的异常。

在这种情况下,您必须明确解决映射问题。通常使用Team.Team数据注释就足够了,但是对同一个表的多次引用总会导致多个级联路径问题,这需要关闭一个或多个关系的删除级联。后者只能用流畅的配置来完成,所以最好用流畅的配置来完成整个映射。

您的模型现在所需的最小配置是:

Team.SupportTeam

请注意,由于没有相应的集合导航属性,因此第二个关系配置使用无参数[InverseProperty]重载来指示。如果您决定将此类集合添加到模型

modelBuilder.Entity<TeamSupport>()
    .HasOne(e => e.Team)
    .WithMany(e => e.SupportTeams);

modelBuilder.Entity<TeamSupport>()
    .HasOne(e => e.SupportTeam)
    .WithMany()
    .OnDelete(DeleteBehavior.Restrict);

不要忘记在相应的映射中指定

WithMany

否则EF将建立第三种关系。

有关详细信息,请参阅EF Core文档的Relationhips部分。