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

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

ef core怎么映射复杂类型 ef core owned types使用教程

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+ 支持)

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

protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity()        .OwnsOne(o => o.ShippingAddress, sa =>        {            sa.Property(a => a.Street).HasColumnName("Ship_Street");            sa.Property(a => a.City).HasColumnName("Ship_City");            sa.Property(a => a.PostalCode).HasColumnName("Ship_PostalCode");        });    modelBuilder.Entity()        .OwnsOne(o => o.BillingAddress, ba =>        {            ba.Property(a => a.Street).HasColumnName("Bill_Street");            ba.Property(a => a.City).HasColumnName("Bill_City");        });}

这样生成的表里,Order 表会包含 Ship_StreetBill_City 等字段,没有额外表。

集合型复杂类型怎么处理

如果一个实体要拥有多个值对象(比如客户有多个联系地址),用 OwnsMany

public class Customer{    public int Id { get; set; }    public string Name { get; set; }    public List
Addresses { get; set; } = new();}

配置方式类似:

modelBuilder.Entity()    .OwnsMany(c => c.Addresses, a =>    {        a.WithOwner().HasForeignKey("CustomerId");        a.Property(x => x.Street).HasColumnName("Addr_Street");    });

这时会生成一张关联子表 CustomerAddresses,带外键和自增序号,但依然没有独立主键或生命周期。

基本上就这些。关键记住:复杂类型不是实体,不查库、不跟踪ID、不单独存,只依附于拥有者存在。

以上就是EF Core怎么映射复杂类型 EF Core Owned Types使用教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1443120.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 19:45:36
下一篇 2025年12月15日 19:42:45

相关推荐

发表回复

登录后才能评论
关注微信