【问题标题】:Multiple Associations from one Object to two Objects of the same Entity Type从一个对象到相同实体类型的两个对象的多个关联
【发布时间】:2011-08-24 13:56:51
【问题描述】:

我正在尝试首先使用代码和流畅的 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) 找到了答案

【问题讨论】:

  • 是的,当两个导航属性指向同一个表时,您不能让 EF 4.1 启用级联删除约束。要启用正确的约束,您需要使用 Seeding 对象在数据库中手动添加它们以执行正确的脚本。
  • 就是这样,正如您所发现的,正如 Alexandre 也指出的那样。在 MSSMS 上手动执行此操作会引发错误“无法创建关系 (...) 可能导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他外键约束。”
  • 您可以将您的解决方案添加为答案并标记它吗?

标签: c# .net ef-code-first entity-framework-4.1 fluent


【解决方案1】:

正如你所说,你应该可以添加.WillCascadeOnDelete(false) - https://stackoverflow.com/a/5559300/5416

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 :)

【讨论】:

    【解决方案2】:

    像往常一样,拉迪斯拉夫 (EF Guru) 有 EF 问题的答案。 (感谢拉迪斯拉夫) 只是我发现有用的替代品。 我有第二个并行运行的解决方案。 如果我每个人都有代码优先问题。我首先尝试一下: 逆向工程师首先编写解决方案。(来自 EF 电动工具)

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

    在项目/解决方案上右键实体框架,先对数据库进行逆向工程。

    查看它生成的代码。你会得到一个如何做某事的例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多