C# 实体框架核心2.0多对多关系同一个表
我正在使用EntityFrameworkCore2.0映射ExistDB,DB有两个选项卡: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
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)