关于 EF Core 中的“拥有”类型

问题描述

在我的项目中,我使用 EF Core fluent 配置,代码优先。我阅读了一些关于 owned types 的内容,但我不太清楚以下情况:

假设我有一个 Project 实体和一个 ProjectType
我应该将该属性映射为:

Entity<Project>.HasOne<ProjectType>(); 或者更确切地说是
Entity<Project>.OwnsOne<ProjectType>();

ProjectType 实体应映射到表 ProjectType(ProjectTypeId,Name,Description)

据我所知,拥有的是

"只能出现在其他导航属性上的类型 实体类型。这些被称为拥有的实体类型。实体 包含一个拥有的实体类型是它的所有者。拥有的实体是 本质上是所有者的一部分,没有它就不能存在"

就我而言

ProjectType 只能出现在 Project 实体类型的导航属性上。ProjectType 本质上是 Project 的一部分,没有它就不能存在”...但是,为了创建一个单独的表,据我所知,我需要使用 HasOne,而不是 OwnsOne... 如果有人能更好地解释这个想法,那就太好了。非常感谢。

解决方法

ProjectTypes 听起来像是一个参考表,在应用程序的整个生命周期中可能会修改它,例如通过系统管理角色。使用新的“Owns”是一种约定,有助于强制执行特定于类型的组合和关系数据模型中的表链接等概念。

一个更好的组合示例:假设您有一个项目,并且作为项目的一部分,有一些相当大且不经常使用的细节。像图像或其他二进制数据,或者一些大文本。当您获取一个项目或多个项目时,将这些 BLOB/CLOB 详细信息放在 Project 表中可能会导致灾难,因此您将它们规范化为一个名为 ProjectDetails 的单独相关表,或者可能是几个相关表。这样,在大多数情况下,当您使用 Project 并加载这些实体时,您不必担心一直拉回这些大字段,您可以引用 ProjectDetails 以仅在实际需要。由于 ProjectDetails 本身并没有真正发挥任何作用,因此它不需要 DbSet 或任何类似的东西,因此我们可以设置从 Project 到 OwnsOne ProjectDetails 的关系。

另一方面,ProjectType 可能有一个 DbSet 来在配置应用程序的过程中建立新的项目类型。您可能还想根据项目类型关联其他与项目相关的详细信息。在这种情况下,将 Project 设为 HasOne ProjectType 会更有意义。我们可以有一个项目类型的 DbSet 来管理,其他实体也可以按项目类型、项目阶段/阶段等进行过滤。

就数据库架构而言,OwnsHas 之间没有区别。这完全是关于 EF DbContext 将如何与实体一起工作。

使用 Owns 的其他常见示例是链接表。例如,您有一个在订单、客户等之间共享的地址表。它们都不是“拥有”地址,但它们确实拥有自己的链接表:订单拥有订单地址,客户拥有客户地址。这些实体“有”一个地址。我们可能仍希望查看地址,因为它们代表物理位置,并且将订单等关联到不同位置与“调整”为物理位置记录的详细信息之间存在差异。 (即更正街道名称或自治市)无需分别处理订单或客户范围之外的 OrderAddresses 或 CustomerAddresses。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...