EF Core怎么映射复杂类型 EF Core Owned Types使用教程

admin 百科 14
EF Core 映射复杂类型的核心是 Owned Entity Types,即值对象直接展平到拥有者表中,不新建表;用 record 或只读 class 定义值对象,通过 OwnsOne/OwnsMany 配置映射。

EF Core怎么映射复杂类型 EF Core Owned Types使用教程-第1张图片-佛山资讯网

EF Core 映射复杂类型,核心就是用 Owned Entity Types(自有实体类型),它本质是官方对“值对象”的原生支持。不是新建表,也不是普通导航属性,而是把值对象的字段直接展平到拥有者的数据库表里。

怎么定义一个值对象类

值对象要体现“无标识、按值比较、不可变(推荐)”的特点:

  • record 最省事,自动实现 EqualsGetHashCode
  • 或者用普通 class,手动重写相等性逻辑,确保所有属性参与比较
  • 属性设为 init 或只读,避免外部随意修改

示例:

public record Address
{
    public string Street { get; init; }
    public string City { get; init; }
    public string PostalCode { get; init; }
    public string Country { get; init; }
}

登录后复制

怎么在实体中使用

直接作为属性声明,不需要主键、不单独映射表:

public class Order
{
    public int Id { get; set; }
    public string Number { get; set; }
    public Address ShippingAddress { get; set; } // 这里就用了
    public Address BillingAddress { get; set; }
}

登录后复制

注意:同一个实体里可以有多个同类型的复杂属性(比如收货地址 + 账单地址),EF Core 能区分列名。

怎么配置映射关系

必须显式告诉 EF Core 这是个自有类型,两种方式任选其一:

  • OnModelCreating 中调用 OwnsOne
  • 给值对象类加 [Owned] 特性(EF Core 2.1+ 支持)

推荐用代码配置,更清晰可控:

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~