Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心2.0多对多关系同一个表_C#_Entity Framework Core - Fatal编程技术网

C# 实体框架核心2.0多对多关系同一个表

C# 实体框架核心2.0多对多关系同一个表,c#,entity-framework-core,C#,Entity Framework Core,我正在使用EntityFrameworkCore2.0映射ExistDB,DB有两个选项卡:Teams和SupportTeam 团队字段:ID,Name 团队支持:团队ID(团队表上的ForeignKey)、SupportTeamID(团队表上的ForeignKey) 我尝试将它们映射为以下内容: public class Team { public int Id { get; set; } public string name { get; set; } p

我正在使用EntityFrameworkCore2.0映射ExistDB,DB有两个选项卡:
Teams
SupportTeam

团队字段:ID,Name

团队支持:团队ID(团队表上的ForeignKey)、SupportTeamID(团队表上的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; }
 }
公共类团队
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表支持团队{get;set;}
}
公共类团队支持
{
public int TeamId{get;set;}
公共虚拟团队{get;set;}
public int SupportTeamId{get;set;}//缺少更好的名称。
公共虚拟团队支持团队{get;set;}
}
但我在运行“添加迁移”时出现了以下错误:

无法确定导航所表示的关系 类型为“列表”的属性“Team.SupportTeams”。任何一个 手动配置关系,或使用忽略此属性 “[NotMapped]”属性,或使用中的“EntityTypeBuilder.Ignore” “OnModelCreating”


TeamSupport
实体有两个引用导航属性到
Team
(它们定义了
TeamSupport
Team
之间的两个多对一关系),但是
Team
实体只有一个集合导航属性,因此,EF不知道如何将其映射(映射到
Team.Team
Team.SupportTeam
)并抛出有问题的异常

在这种情况下,必须显式解析映射。通常,使用
[InverseProperty]
数据注释就足够了,但是对同一个表的多个引用总是会导致多个级联路径问题,这需要关闭一个或多个关系的删除级联。后者只能用fluent配置完成,所以最好用fluent配置完成整个映射

您的模型现在需要的最低配置是:

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

modelBuilder.Entity<TeamSupport>()
    .HasOne(e => e.SupportTeam)
    .WithMany()
    .OnDelete(DeleteBehavior.Restrict);
不要忘记在相应的映射中指定它

.WithMany(e => e.SupportOfTeams)
否则,EF将创建第三个关系


有关更多信息,请参阅EF Core文档的一节。

在本例中,SupportTeam类型为List。我如何才能将SupportTeams重新返回为列表。如果您是指在模型级别,您目前无法按照文档链接中的小节中所述的回答:“尚未支持没有实体类来表示联接表的多对多关系。”但您始终可以使用LINQ
Select
TeamSupport
列表中提取
SupportTeam
属性。
.WithMany(e => e.SupportOfTeams)