Entity Framework Core 中的 ComplexType 和 OwnsOne 有什么区别?

问题描述 投票:0回答:1

我正在使用 EF7,注意到 EF6 中有一个 ComplexType,它在 EF7 中丢失,并再次添加到 EF8 中。因此,在 EF7 中,OwnsOne 函数用于实现像复杂类型一样的值对象。因此,我很想了解 OwnsOne 和 ComplexType 之间的区别,以及是否有任何特殊和重要的地方,我应该将我的 dotnet 和 EF 版本升级到 8。

entity-framework .net-core entity-framework-6
1个回答
0
投票

这至少部分包含在在此处输入链接描述文档(强调我的):

保存到数据库的对象可以分为三大类:

  • 非结构化且保存单一值的对象。例如,
    int
    Guid
    string
    IPAddress
    。这些(有点松散地)称为“原始类型”。
  • 被构造为保存多个值的对象,并且对象的标识由键值定义。例如,
    Blog
    Post
    Customer
    。这些称为“实体类型”。
  • 被构造为保存多个值的对象,但该对象没有定义身份的键。例如,
    Address
    Coordinate

在 EF8 之前,没有很好的方法来映射第三种类型的对象。 拥有的类型 可以使用,但由于拥有的类型实际上是实体类型,因此它们具有基于键值的语义,即使该键值被隐藏

EF8 现在支持“复杂类型”来涵盖第三种类型的对象。复杂类型对象:

  • 不通过键值识别或跟踪。
  • 必须定义为实体类型的一部分。 (换句话说,您不能拥有复杂类型的
    DbSet
    。)
  • 可以是 .NET 值类型引用类型
  • 实例可以由多个属性共享。

这种差异的结果之一是拥有的类型可以存储在单独的表中(请参阅文档的在单独的表中存储拥有的类型部分):

与 EF6 复杂类型不同的是,拥有的类型可以存储在与所有者不同的表中。

虽然复杂类型(ATM)没有(来自公告):

我们不打算允许复杂类型映射到它们自己的表。但是,在未来的版本中,我们确实计划允许将复杂类型保存为单列中的 JSON 文档。

这导致当前复杂类型不支持集合(请参阅限制部分),而对于自有类型,可以通过单独的表(自有类型的集合

© www.soinside.com 2019 - 2024. All rights reserved.