关于 EF Core 中的 "owned" 类型
On the "owned" types in EF Core
在我的项目中,我使用 EF Core fluent 配置,代码优先。我读了一些关于 owned types 的内容,但我不太清楚下面的情况:
假设我有一个 Project
实体和一个 ProjectType
.
我应该将 属性 映射为 :
Entity<Project>.HasOne<ProjectType>();
或者说
Entity<Project>.OwnsOne<ProjectType>();
ProjectType
实体应映射到 table ProjectType(ProjectTypeId, Name, Description)
据我所知,拥有
"types that can only ever appear on navigation properties of other
entity types. These are called owned entity types. The entity
containing an owned entity type is its owner. Owned entities are
essentially a part of the owner and cannot exist without it"
就我而言
"ProjectType
只能出现在 Project
实体类型的导航属性中。ProjectType
本质上是 Project
的一部分,没有它就无法存在"。 .. 然而,为了创建一个单独的 table,据我所知,我需要使用 HasOne
,而不是 OwnsOne
... 如果有人能更好地解释这个想法,那就太好了。非常感谢。
ProjectTypes 听起来像是一个参考 table,否则可能会在应用程序的生命周期中进行修改,例如通过系统管理角色。新的“Owns”的使用是一种约定,有助于实施特定类型组合等概念,并在关系数据模型中链接 tables。
一个更好的组合示例:假设您有一个项目,并且作为项目的一部分,有一些相当大且不经常使用的细节。诸如图像或其他二进制数据之类的东西,或者可能是一些大文本。在项目 table 中包含这些 BLOB/CLOB 详细信息可能会在您获取一个或多个项目时导致灾难,因此您将它们规范化为一个单独的相关 table 称为 ProjectDetails,或者可能有几个相关的 table。这样,在大多数情况下,当您使用 Project
并加载这些实体时,您不必一直担心拉回这些大字段,您可以引用一个 ProjectDetails 以仅在它是实际上需要。由于 ProjectDetails 本身并没有真正服务于任何目的,它不需要 DbSet 或类似的东西,因此我们可以设置从 Project 到 OwnsOne
ProjectDetails.
的关系
另一方面,ProjectType 可能有一个 DbSet,用于在配置应用程序的过程中建立新的项目类型。您可能还希望根据项目类型关联其他与项目相关的详细信息。在这种情况下,将 Project 设置为 HasOne
ProjectType 更有意义。我们可以有一个 ProjectTypes 的 DbSet 来管理,其他实体也可以按 ProjectTYpe、Project Stages/Phases 等进行过滤
就 Owns
和 Has
之间的数据库模式而言,没有区别。这完全是关于 EF DbContext 将如何与实体一起工作。
使用 Owns
的其他常见示例是链接 table。例如,您有一个在订单、客户等之间共享的地址 table。两者都不“拥有”地址,但他们确实拥有自己的链接 table:订单拥有订单地址,客户拥有客户地址。这些实体“有”一个地址。我们可能仍然希望查看地址,因为它们代表物理位置,并且将订单等关联到不同位置与“调整”为物理位置记录的详细信息之间存在差异。 (即更正街道名称或市政当局)无需分别处理订单或客户范围之外的订单地址或客户地址。
在我的项目中,我使用 EF Core fluent 配置,代码优先。我读了一些关于 owned types 的内容,但我不太清楚下面的情况:
假设我有一个 Project
实体和一个 ProjectType
.
我应该将 属性 映射为 :
Entity<Project>.HasOne<ProjectType>();
或者说
Entity<Project>.OwnsOne<ProjectType>();
ProjectType
实体应映射到 table ProjectType(ProjectTypeId, Name, Description)
据我所知,拥有
"types that can only ever appear on navigation properties of other entity types. These are called owned entity types. The entity containing an owned entity type is its owner. Owned entities are essentially a part of the owner and cannot exist without it"
就我而言
"ProjectType
只能出现在 Project
实体类型的导航属性中。ProjectType
本质上是 Project
的一部分,没有它就无法存在"。 .. 然而,为了创建一个单独的 table,据我所知,我需要使用 HasOne
,而不是 OwnsOne
... 如果有人能更好地解释这个想法,那就太好了。非常感谢。
ProjectTypes 听起来像是一个参考 table,否则可能会在应用程序的生命周期中进行修改,例如通过系统管理角色。新的“Owns”的使用是一种约定,有助于实施特定类型组合等概念,并在关系数据模型中链接 tables。
一个更好的组合示例:假设您有一个项目,并且作为项目的一部分,有一些相当大且不经常使用的细节。诸如图像或其他二进制数据之类的东西,或者可能是一些大文本。在项目 table 中包含这些 BLOB/CLOB 详细信息可能会在您获取一个或多个项目时导致灾难,因此您将它们规范化为一个单独的相关 table 称为 ProjectDetails,或者可能有几个相关的 table。这样,在大多数情况下,当您使用 Project
并加载这些实体时,您不必一直担心拉回这些大字段,您可以引用一个 ProjectDetails 以仅在它是实际上需要。由于 ProjectDetails 本身并没有真正服务于任何目的,它不需要 DbSet 或类似的东西,因此我们可以设置从 Project 到 OwnsOne
ProjectDetails.
另一方面,ProjectType 可能有一个 DbSet,用于在配置应用程序的过程中建立新的项目类型。您可能还希望根据项目类型关联其他与项目相关的详细信息。在这种情况下,将 Project 设置为 HasOne
ProjectType 更有意义。我们可以有一个 ProjectTypes 的 DbSet 来管理,其他实体也可以按 ProjectTYpe、Project Stages/Phases 等进行过滤
就 Owns
和 Has
之间的数据库模式而言,没有区别。这完全是关于 EF DbContext 将如何与实体一起工作。
使用 Owns
的其他常见示例是链接 table。例如,您有一个在订单、客户等之间共享的地址 table。两者都不“拥有”地址,但他们确实拥有自己的链接 table:订单拥有订单地址,客户拥有客户地址。这些实体“有”一个地址。我们可能仍然希望查看地址,因为它们代表物理位置,并且将订单等关联到不同位置与“调整”为物理位置记录的详细信息之间存在差异。 (即更正街道名称或市政当局)无需分别处理订单或客户范围之外的订单地址或客户地址。