【问题标题】:Entity Framework Fluent API: Composite key -> Circular relationships实体框架 Fluent API:复合键 -> 循环关系
【发布时间】:2017-08-31 01:25:51
【问题描述】:

有3张桌子:

  • 父母(父母)
  • 儿童(儿童)
  • 一个孩子到另一个孩子的转变(跳跃)

例如想象书。是书本身,就会表亲。这本书有页,孩子们。页面上有脚注——指向其他页面的链接,它会跳转。

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

表格跳转。它描述了一个脚注。将要转换的页面 ID (SourceChildId) 和将要转换的页面 ID (TargetChildId)。由于转换发生在同一本书(父)中,该书使用一个字段作为两个键 - ParentId。

我认为这个结构是合乎逻辑的,直到我尝试 Udpdate-Database 命令,我得到一个异常:“检测到具有引用完整性约束的循环关系。” 这枚戒指参考了我最喜欢的桌 Jumps...我真的很喜欢他们的 lokalitetu,但是....

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

Visual Studio 项目。 〜10mb。谷歌驱动器:

https://drive.google.com/open?id=0B2Je5INk3Cy2bXdfWHZSTm1lUms

最好的祝愿, 谢尔盖

【问题讨论】:

  • 我认为这个问题导致 Jump.ParentId 和 Jump.Source.ParentId 可以(理论上)不一样...可以通过 flyent API 设置吗?

标签: c# postgresql entity-framework ef-code-first entity-framework-migrations


【解决方案1】:

我解决了这个问题。 2 个改动。

1) 脱离Jump 对象引用,只留下属性。设置 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 });

2) 在设置 Parent.FirstChildId 之前进入 Seed() 我调用了 context.SaveChanges()

已解决的问题项目: https://drive.google.com/open?id=0B2Je5INk3Cy2aTB4ZVNBZEVfbEE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多