我在用着实体框架核心 2.0为了映射现有数据库,该数据库有两个表:Teams
and SupportTeam
.
团队领域:身份证号、姓名
团队支持:TeamID(团队表上的外键),支持TeamID(团队表上的外键)
我尝试将它们映射如下:
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'。
The TeamSupport
实体有two 参考导航属性Team
(定义了两个多对一的关系TeamSupport
and Team
),但是Team
实体只有one 收藏导航属性,因此 EF 不知道如何映射它(到Team.Team
or 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
过载来表明这一点。如果您决定将此类集合添加到模型中
public class Team
{
public int Id { get; set; }
public string name { get; set; }
public List<TeamSupport> SupportTeams { get; set; }
public List<TeamSupport> SupportOfTeams { get; set; } // <--
}
不要忘记在相应的映射中指定
.WithMany(e => e.SupportOfTeams)
否则 EF 将创建第三种关系。
欲了解更多信息,请参阅人际关系 https://learn.microsoft.com/en-us/ef/core/modeling/relationshipsEF Core 文档的部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)