C# 实体框架Fluent API:复合键->;循环关系

C# 实体框架Fluent API:复合键->;循环关系,c#,postgresql,entity-framework,ef-code-first,entity-framework-migrations,C#,Postgresql,Entity Framework,Ef Code First,Entity Framework Migrations,共有3个表格: 父母 儿童 一个孩子到另一个孩子的过渡(跳跃) 比如想象书。是书本身,它将是父母的餐桌。孩子们,这本书有几页。页面上有脚注和其他页面的链接,它会跳转 对于儿童,我使用复合键(new{ChildId,ParentId}),因为与书籍类似,第1页可以在各种书籍中找到。在现实世界中,字符串的ID包含一个代码 桌子跳了起来。它描述了一个脚注。将转换的页面ID(SourceChildId)和将转换的页面ID(TargetChildId)。因为转换发生在同一本书(父)中,该书使用一个字段

共有3个表格:

  • 父母
  • 儿童
  • 一个孩子到另一个孩子的过渡(跳跃)
比如想象书。是书本身,它将是父母的餐桌。孩子们,这本书有几页。页面上有脚注和其他页面的链接,它会跳转

对于儿童,我使用复合键(new{ChildId,ParentId}),因为与书籍类似,第1页可以在各种书籍中找到。在现实世界中,字符串的ID包含一个代码

桌子跳了起来。它描述了一个脚注。将转换的页面ID(SourceChildId)和将转换的页面ID(TargetChildId)。因为转换发生在同一本书(父)中,该书使用一个字段作为键-父ID

我认为这个结构是合乎逻辑的,直到我尝试Udpdate数据库命令,我得到一个异常:“检测到引用完整性约束的循环关系。” 这枚戒指是我最喜欢的跳台标志。。。我真的很喜欢他们的lokalitetu,但是

请帮助我为此任务模拟CodeFirst的模型数据(与书籍、页面和脚注页面进行类比)。测试项目附件

VisualStudio项目~10mb。谷歌硬盘:

致以最良好的祝愿, 谢尔盖

我解决了这个问题。 2个变化

1) 离开跳转对象引用,只保留属性。设置fluent Api,如:

modelBuilder.Entity<Child>().HasMany(x => x.JumpsFrom).WithRequired().HasForeignKey(x => new { x.SourceId, x.ParentId });
modelBuilder.Entity<Child>().HasMany(x => x.JumpsTo).WithOptional().HasForeignKey(x => new { x.TargetId, x.ParentId });
modelBuilder.Entity().HasMany(x=>x.JumpsFrom).WithRequired().HasForeignKey(x=>new{x.SourceId,x.ParentId});
modelBuilder.Entity().HasMany(x=>x.JumpsTo).WithOptional().HasForeignKey(x=>new{x.TargetId,x.ParentId});
2) 在设置Parent.FirstChildId之前,我是调用context.SaveChanges()的

已解决问题项目:

我认为这个问题会导致Jump.ParentId和Jump.Source.ParentId(具体而言)不一样。。。可以通过flyent API进行设置吗?