在 EF Core 2.0 及更高版本中将值对象保留为拥有的实体类型
即使在 DDD 中的规范值对象模式之间存在一些差距
和 EF Core 中的自有实体类型,这是目前最好的方法
使用 EF Core 2.0 及更高版本保留值对象。
自有实体类型功能自 2.0 版起添加到 EF Core。
拥有的实体类型允许您映射没有它们的类型
在域模型中明确定义的自己的身份,并用作
任何实体中的属性,例如值对象。一个
拥有的实体类型与另一个实体类型共享相同的 CLR 类型
(也就是说,它只是一个普通的类)。包含的实体
定义导航是所有者实体。询问车主时,
默认情况下包含拥有的类型。
仅通过查看域模型,拥有的类型看起来像
没有任何身份。然而,在幕后,拥有的类型确实
有身份,但所有者导航属性是其中的一部分
身份。
拥有类型的实例的身份并不完全是它们自己的。
它由三个部分组成:
-所有者的身份
-指向它们的导航属性
-在拥有类型的集合的情况下,一个独立的组件(在 EF Core 2.2 及更高版本中受支持)。
按照惯例,会为拥有的类型创建一个影子主键,并且
它将通过使用表映射到与所有者相同的表
分裂。这允许使用拥有的类型,类似于复杂程度
类型在传统 .NET Framework 的 EF6 中使用。
需要注意的是,拥有的类型永远不会被
EF Core 中的约定,因此您必须明确声明它们。
有关自有实体类型的其他详细信息
-当您使用 OwnsOne fluent API 将导航属性配置为特定类型时,会定义拥有的类型。
-在我们的元数据模型中,拥有类型的定义是由以下各项组成的:所有者类型、导航属性和 CLR 类型
拥有的类型。
-我们堆栈中拥有类型实例的身份(键)是所有者类型的身份和定义的组合
拥有的类型。
自有实体功能
- 拥有的类型可以引用其他实体,无论是拥有的(嵌套拥有的类型)还是非拥有的(常规引用导航属性到其他实体)
实体)。
-您可以通过单独的导航属性将相同的 CLR 类型映射为同一所有者实体中的不同拥有类型。
-表拆分是按约定设置的,但您可以通过使用 ToTable 将拥有的类型映射到不同的表来选择退出。
-对拥有的类型自动执行预加载,也就是说,不需要在查询中调用 .Include()。
-可以使用属性 [Owned] 进行配置,使用 EF Core 2.1 及更高版本。
-可以处理拥有类型的集合(使用 2.2 及更高版本)。
自有实体限制
-您无法创建自有类型的 DbSet(按设计)。
-您不能在拥有的类型上调用 ModelBuilder.Entity()(目前是设计使然)。
-不支持与所有者在同一个表中映射的可选(即可为空)拥有类型(即使用表
分裂)。这是因为对每个属性都进行了映射,我们
对整个空复值没有单独的标记。
- 不支持拥有类型的继承映射,但您应该能够映射具有相同继承层次结构的两个叶类型
不同的拥有类型。 EF Core 不会对以下事实进行推理
它们是同一层次结构的一部分。
与 EF6 的复杂类型的主要区别
-表拆分是可选的,也就是说,它们可以选择映射到单独的表,并且仍然是拥有的类型。
-它们可以引用其他实体(也就是说,它们可以作为与其他非拥有类型的关系的依赖方)。