从一个对象到同一实体类型的两个对象的多重关联

10
我正在尝试使用Code First和Fluent API创建一个对象,该对象可以保存来自同一表的两个不同实体。换句话说,传输对象保存对两个不同的油罐对象的引用 - 一个是源,另一个是目标。
然而,当我使用以下代码时,我会收到一个异常,指出“引用关系将导致不允许的循环引用”。
modelBuilder.Entity<Transfer>()
            .HasRequired<Tank>(t => t.Source)
            .WithMany(t => t.OutboundTransfers);
modelBuilder.Entity<Transfer>()
            .HasRequired<Tank>(t => t.Destination)
            .WithMany(t => t.InboundTransfers);

我的最佳猜测是它认为我将两个键都指向了同一个坦克?有什么办法可以实现这个功能吗?

编辑:从Entity Framework Code First - two Foreign Keys from same table中找到了答案,添加.WillCascadeOnDelete(false)。


2
是的,当两个导航属性指向同一张表时,你不能让EF 4.1启用级联删除约束。为了启用正确的约束,你需要使用种子对象手动在数据库中添加它们,并执行正确的脚本。 - Alexandre Brisebois
就像你已经发现的,以及Alexandre所指出的那样,这就是问题所在。在MSSMS上手动操作会出现错误:“无法创建关系(...)可能会导致循环或多个级联路径。请指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。” - Anderson Matos
1
你能否将你的解决方案添加为答案并标记一下? - sinelaw
2个回答

1

正如您所说,您应该能够添加.WillCascadeOnDelete(false) - https://dev59.com/tW035IYBdhLWcg3wNdLg#5559300

modelBuilder.Entity<Transfer>()
        .HasRequired<Tank>(t => t.Source)
        .WithMany(t => t.OutboundTransfers)
        .WillCascadeOnDelete(false);
modelBuilder.Entity<Transfer>()
        .HasRequired<Tank>(t => t.Destination)
        .WithMany(t => t.InboundTransfers)
        .WillCascadeOnDelete(false);

我刚刚添加了这个答案,以便它不再显示在未回答列表中,因为它没有任何答案。标记为社区 wiki :)


0

像往常一样,Ladislav(EF大师)对EF问题有答案。(谢谢Ladislav) 这是我发现有用的替代方案。 我有一个并行运行的第二个解决方案。 如果我遇到Code First问题。我首先尝试这个: 使用EF Power Tools反向工程生成Code First解决方案。

我有一个测试数据库,在其中手动添加所需的概念。 我仍然发现在数据库中执行此操作更直观,因为我是Code First的新手。 然后使用PowerTool http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

在项目/解决方案上右键单击Entity Framework,反向工程生成DB以生成Code First。

检查生成的代码。您将获得如何执行某些操作的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接