我正在使用 EF7,注意到 EF6 中有一个 ComplexType,它在 EF7 中丢失,并再次添加到 EF8 中。因此,在 EF7 中,OwnsOne 函数用于实现像复杂类型一样的值对象。因此,我很想了解 OwnsOne 和 ComplexType 之间的区别,以及是否有任何特殊和重要的地方,我应该将我的 dotnet 和 EF 版本升级到 8。
这至少部分包含在在此处输入链接描述文档(强调我的):
保存到数据库的对象可以分为三大类:
- 非结构化且保存单一值的对象。例如,
、int
、Guid
、string
。这些(有点松散地)称为“原始类型”。IPAddress
- 被构造为保存多个值的对象,并且对象的标识由键值定义。例如,
、Blog
、Post
。这些称为“实体类型”。Customer
- 被构造为保存多个值的对象,但该对象没有定义身份的键。例如,
、Address
。Coordinate
在 EF8 之前,没有很好的方法来映射第三种类型的对象。 拥有的类型 可以使用,但由于拥有的类型实际上是实体类型,因此它们具有基于键值的语义,即使该键值被隐藏。
EF8 现在支持“复杂类型”来涵盖第三种类型的对象。复杂类型对象:
这种差异的结果之一是拥有的类型可以存储在单独的表中(请参阅文档的在单独的表中存储拥有的类型部分):
与 EF6 复杂类型不同的是,拥有的类型可以存储在与所有者不同的表中。
虽然复杂类型(ATM)没有(来自公告):
我们不打算允许复杂类型映射到它们自己的表。但是,在未来的版本中,我们确实计划允许将复杂类型保存为单列中的 JSON 文档。