实体框架中的第二个 Self-To-Self 关系

2024-04-17

假设我们有一个域类

public class Incident
{
    [Key]
    public virtual int IncidentId { get; set; }

    [Display(Name = "Parent Incident")]
    public virtual Incident ParentIncident { get; set; }

    [Display(Name = "Related Claim")]
    public virtual Incident ClaimIncident { get; set; }

 }

为了简单起见,省略了其他属性。

当我刚刚ParentIncident就位后,一切正常。现在我已经添加了ClaimIncident到班级。我正在尝试使用 Entity Framework 4.3(预发布)更新我的数据库Migrations选项,但我收到错误,EF 不知道如何将事件映射到事件。

为什么每个类允许引用同一个类实例一次,而当我引入第二个类时,它突然不知道如何引用它?我怎样才能纠正模型类?


这就是我认为正在发生的事情。当您只有 ParentIncident Code First 时,按照惯例将其映射为自引用一对多单向独立关联的一端。这里有很多行话——让我解释一下:

  • 自引用:从问题中可以明显看出,事件实体位于关系的两端。
  • 一对多:每个事件都有一个父事件,一个事件可以是多个事件的父事件。
  • 单向:有从事件到其父事件 (ParentIncident) 的导航属性,但没有子事件的反向集合导航属性。
  • 独立关联:由于类中没有外键属性,EF 在数据库中创建一个 FK 列(称为 ParentIncident_IncidentId),但它不映射到任何对象属性。

现在,当您添加 ClaimIncident 属性时,这会更改 Code First 尝试映射的方式。它现在创建一个自引用的一对一双向 FK 关联:

  • 一对一,因为它看到从事件到事件的两个导航属性,并假设它们是同一关系的两侧。由于两者都不是集合属性,因此关系是一对一的。
  • 再次是双向的,因为现在关系的每一端都有一个导航属性。
  • FK,因为一对一关系变为 PK 到 PK,并且 EF 始终将其视为 FK 关系,因为 FK(即 PK)已映射。

但 Code First 无法弄清楚这种一对一关系的哪一端应该是主体端,哪一端应该是从属端。有时这确实很重要......所以 Code First 会抛出异常。

好的,所以我将从线程和您的模型中推断出您实际上并不想要这里存在一对一的关系。 (一对一的自引用 PK 到 PK 关系是毫无意义的,因此您可能会认为 Code First 不应该创建它,但 Code First 并不那么聪明。)

所以你把 FK 放进去。发生了两件事。首先,Code First 现在假设这些必须再次是一对多关系。其次,Code First 现在有了 FK 属性的名称,并依次使用该名称来命名数据库中的 FK 列。但该名称与已为独立关联创建的 FK 列不同 — 它不是 ParentIncident_IncidentId。这意味着迁移必须删除此列并创建一个新列...导致数据丢失。

要告诉 Code First 您实际上只需要两个自引用、单向、一对多、独立的关联,请使用以下流畅的映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Incident>()
        .HasOptional(e => e.ParentIncident)
        .WithMany();

    modelBuilder.Entity<Incident>()
        .HasOptional(e => e.ClaimIncident)
        .WithMany();
}

现在迁移应该正确更新您的数据库。现在,必须要说的是,您可能要考虑更改为 FK 关联,在这种情况下,您要么需要在 Migrations 中进行一些数据移动,如果有数据丢失就接受,或者告诉 Code First 继续使用 FK之前生成的列名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架中的第二个 Self-To-Self 关系 的相关文章

  • 如何从 .Net 中的许多 HTML 文件中读取 xpath 值?

    我的一个文件夹中有大约 5000 个 html 文件 我需要循环遍历它们 打开 使用 xpath 获取 10 个值 关闭并存储在 SQL Server 数据库中 使用 Net 读取 xpath 值的最简单方法是什么 xpath 应该相当稳定
  • 使用 SESSION_CONTEXT 的实体框架核心行级安全性

    我正在使用 ASP NET Core 和 Entity Framework 7 Core 编写一个使用行级安全性的多租户应用程序 由于我的数据库托管在 Microsoft SQL Server 上 因此我使用了this https msdn
  • XML 序列化基类列表

    我有课A从类继承B 我有一个班级名单B其中包含A and B items List b myList new List b myList Add new A 当我尝试使用序列化此列表时XmlSerializable 抛出异常 如果我将列表定
  • 如何转换十进制?到小数

    可能这是一个简单的问题 但我正在尝试所有的转换方法 并且仍然有错误 你能帮我吗 小数 可为空的小数 到小数 有很多选择 decimal x decimal a decimal x works throws if x was null dec
  • Asp.net core - 没有这样的表:AspNetUsers

    所以我试图为我的 asp net core 应用程序实现用户登录 我正在关注微软教程here https docs asp net en latest security authentication identity html 我有两个上下
  • LegacyUnhandledExceptionPolicy 不允许捕获(并吞下)ThreadAbortException?

    我正在使用 NET 1 1 兼容模式来处理未处理的异常 问题是 当 LegacyUnhandledExceptionPolicy 设置为 1 这就是我想要的 时 我无法捕获并吞下 ThreadAbortException 示例代码 应用程序
  • 为什么我的 .Net 对象不可序列化?

    我有一个继承自 System Data DataTable 的 MyDataTable 类 我已经在我的类中实现了 ISerialized 并且有一个 公共覆盖子 GetObjectData 但是 当我尝试序列化 MyDataTable 的
  • 使用模型优先方法时如何播种数据?

    所以我正在学习MVC3和EF4 我尝试了代码优先方法 但它对我来说太混乱了 我可以毫无问题地创建类 但最困难的部分是处理外键和彼此之间的关系 但我首先选择了模型 这样我就可以直观地设计它并查看关系在哪里 创建模型后 它会为我创建一个 SQL
  • System.Globalization.CultureInfo 不包含 Name 的定义

    我对 System Globalization CultureInfo 类和 System Globalization 命名空间有这个特殊问题 我从具有 CultureInfo 属性的 API 调用返回一个对象 语言 我能够成功地将其在客户
  • AspNet.Identity 自定义用户和自定义角色应该很简单;我缺少什么?

    使用来自的示例http www asp net identity http www asp net identity我已经走到这一步了 这RoleManager工作完美 我对待UserManager相同 我认为一切都是正确的 但我似乎无法更
  • 来自其他位置的 .NET 参考 dll

    我正在根据第三方程序中包含的一些 DLL 制作一个程序 我不被允许自己分发这些 DLL 必须安装第三方程序才能使我的程序运行 我怎样才能引用这些DLL 我通过程序设置的注册表项知道它们的确切位置 我尝试在 Project gt Refere
  • 有没有办法指定 .net 将使用哪个 NetworkInterface?

    我想使用 Wifi 和 LAN 连接在设备上运行一系列测试 我有两张网卡 一张是WiFi 一张是有线 该设备具有可通过两个网络接口访问的单个 IP 地址 有没有办法保证我的机器使用特定的网络接口 以便我可以通过有线连接运行所有测试 然后通过
  • CLR 类中的内存泄漏

    我遇到了内存泄漏 并追踪到 CLR 中的这个字段 Microsoft CSharp RuntimeBinder RuntimeBinder s instance m semanticChecker globalSymbolContext G
  • C#.net 中的 XML 数据库

    我正在为一些网站开发WPF客户端程序 它使用 XML 数据库 我是 XML 新手 请有人解释一下如何创建 附加 最重要 编辑 读取和加密 XML 文件 我知道这是一个大问题 但是 事情很紧急 必须尽快完成工作 在网上查了一下 没有得到正确的
  • 使用 Bloomberg .Net API 的每小时数据

    我正在努力解决使用 Net API 3 0 从 Bloomberg 获取每小时开盘价 最高价 最低价和最后价格快照的逻辑 我已经用谷歌搜索了很多次 但没有运气 对此的任何帮助将不胜感激 我试图在 Bloomberg Net API C 中找
  • C#.NET VS2010 断点不起作用

    当我去调试代码时 所有断点都被透明填充 只留下轮廓 并且中间有一个感叹号的小三角形位于断点的角落 当我将鼠标悬停在断点上时 错误是 当前不会命中断点 源代码与原始版本不同 我在一个多小时内没有尝试调试我的代码 在此期间我添加了一个具有多个线
  • TransactionScope 超时过早发生?

    我在用着TransactionScope进行一些批量插入和更新 问题是 即使我设置了超时 我也会在 30 分钟长的操作中遇到超时异常TransactionScope到一小时 此外 在异常之后 它会插入看似随机数量的批次记录 例如 最后一个操
  • 复制到其他计算机时无法在 WcfTestClient 中添加服务

    我想在另一台计算机上运行 WcfTestClient VS2012 中包含的一个 而不安装 VS2012 这可能吗 在我已经安装了 NET 4 5 的机器上 但是当我尝试添加 Web 服务时 它给了我以下堆栈跟踪 Exception Tex
  • 如何使用 C# 从 Kafka 获取主题列表

    我想从卡夫卡获取主题列表 我正在使用 kafka net 客户端 但无法在有关获取主题列表的文档中找到 您可以使用 Confluence Kafka 包中提供的 AdminClient 列出所有主题 using Confluent Kafk
  • 使用 C# 在 Powerpoint 2013 中创建具有多个系列的图表

    我使用的是 VS2013 Ultimate 带有 Office 2013 已安装 PowerPoint Excel 和 Word 我正在用 C 编码 我正在使用 C 创建 PowerPoint 演示文稿 到目前为止 我已经成功地完成了我想做

随机推荐

  • Riverpod 不必要的重建

    问题是 当我单击其中一个 CharBarButtons 小部件时 所有其他 CharBarButtons 也会被重建 是否有一种方法可以避免这种情况 并在使用 StateNotifier 保存列表时单独进行重建 整数是按钮的位置 CharB
  • Play Framework 2 Scala WS 执行同步请求

    我正在学习Scala 我曾经使用 Play Framework 2 Java 并尝试使用和学习 Scala 重写我之前的一些工作 我需要执行同步 WS 请求并从代码中的某处获取结果对象 当我回到 Java 时 我曾经这样做过 WS url
  • Rails:尝试渲染为 JSON 时 attr_accessor 不显示

    在我的应用程序中 我有一个如下的模型 class Init lt ActiveRecord Base attr accessor clientAvailability attr accessible returnCode returnMes
  • 根据javascript中的条件在数组中插入具有相同键值的多个对象

    例如 我有一个具有多个值的对象 let obj a day1 b c day3 aa 10 bb 11 cc 12 let data let item for let i in obj if i a data title obj a dat
  • Oracle PL/SQL:从字符串中删除“空格字符”

    在我的 Oracle 10g 数据库中 我想从表字段的值中删除 空格字符 空格 制表符 回车符 Is TRANSLATE 该怎么走 例如 MY VALUE TRANSLATE MY VALUE CHR 9 CHR 10 CHR 11 CHR
  • 如何查找 pthread 是否有挂起的取消请求

    我想知道是否对于一个线程 pthread cancel是否已被调用 我不想使用一些表并维护它 有没有可用的库函数 我不想使用一些取消点函数来取消线程 如果有任何挂起的取消请求 这些取消点函数就会取消线程 我只想知道是否有任何挂起的取消请求
  • 使用 zlib 解压缩 PNG

    如何使用 zlib 库解压缩 PNG 文件 我需要在 gcc 编译器下使用 C 读取 PNG 文件 为什么不使用libpng http www libpng org pub png libpng html PNG 文件格式相当简单 但有许多
  • 以编程方式设置 logback.xml 路径

    我知道我可以像这样设置 logback xml 路径 将默认配置文件的位置指定为系统属性 您可以使用名为 logback configurationFile 的系统属性指定默认配置文件的位置 该属性的值可以是 URL 类路径上的资源或应用程
  • 7.02之前的ABAP中如何编码JSON

    正如霍斯特 凯勒在他的著作中提到的ABAP 和 JSON http scn sap com people horst keller blog 2013 01 07 abap and json帖子 ABAP 原生支持 7 02 和 7 03
  • 估计 64 位 Java 中最大安全 JVM 堆大小

    在分析存在一些问题的 64 位 Java 应用程序的过程中 我注意到分析器本身 YourKit 正在使用真正大量的内存 我在 YourKit 启动脚本中得到的是 JAVA HEAP LIMIT Xmx3072m XX PermSize 25
  • 使用 Symfony 的 ACL 时,使用 JOIN 查询还是 IN 数组查询更好?

    这个问题建立在以下讨论的基础上 如何使用 Symfony ACL 过滤我的 Doctrine 查询 https stackoverflow com questions 14858642 how to filter my doctrine q
  • ExpandableListAdapter 在什么条件下调用 getChildView()

    在我的应用程序中 getChildView 在我里面可扩展列表适配器当适配器返回正确的子计数时 当getChildrenCount 叫做 我的问题是 为了让 ExpandableListAdapter 膨胀其子项 需要满足哪些条件 当组和子
  • 将背景图像放置在距右侧 1em 处?

    据我所知 不可能将 CSS 背景图像放置在距任何块的右边框 1em 处 也不可能放置图像距底部 1em 处 以下代码将背景图像放置在距左侧 1em 和距顶部 2em 的位置 div class foo style background ur
  • Visual Studio 2013 上下文菜单仅在 Web 应用程序项目中缓慢

    我最近为了一个新项目从 VS 2010 升级到 VS 2013 我发现当右键单击 Web 应用程序项目中的文件夹 而不是单个文件 时 加载上下文菜单大约需要 2 秒 解决方案中的其他十多个非 Web 项目不存在此性能问题 此外 在那个缓慢的
  • ElementHost 内 WPF 控件的呈现问题

    我有一个 WinForms 控件 里面有一个TableLayoutPanel其中持有多个ElementHosts和每个ElementHost包含一个 WPF 控件 一切正常 除非控件的大小大于窗口和ScrollBar有没有 当我向下滚动时
  • 在 RoR 视图中获取 {{attribute}} {{message}}

    登录 1 个错误禁止保存此 model 以下字段存在问题 属性 消息 这是查看代码 h1 Login h1 br br br br br br
  • jQuery 使用什么正则表达式进行电子邮件验证?

    Jquery 可以验证电子邮件地址 http docs jquery com Plugins Validation http docs jquery com Plugins Validation jQuery 使用什么正则表达式 如果有 进
  • 直接通过 SSH 进入 docker 容器

    我有一些 docker 容器 现在我想通过 ssh 访问其中一个 这是工作我通过 ssh 连接到 docker 容器 但现在我遇到的问题是我不知道哪个用户可以访问这个容器 我已经对主机上的两个用户 网络和根 进行了尝试 但它们不起作用 知道
  • 如何使用 exec() 启动和停止 PHP 开发服务器

    如何使用 exec 函数启动和停止 PHP 开发服务器 我需要这样做才能自动化我的 BDD 测试 这将停止我的脚本的执行 echo exec php S localhost 8000 所以我需要一种方法从 PHP 启动服务器并能够继续执行我
  • 实体框架中的第二个 Self-To-Self 关系

    假设我们有一个域类 public class Incident Key public virtual int IncidentId get set Display Name Parent Incident public virtual In