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

EF Core 映射复杂类型,核心就是用 Owned Entity Types(自有实体类型),它本质是官方对“值对象”的原生支持。不是新建表,也不是普通导航属性,而是把值对象的字段直接展平到拥有者的数据库表里。
值对象要体现“无标识、按值比较、不可变(推荐)”的特点:
Equals 和 GetHashCode
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<Order>()
.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<Order>()
.OwnsOne(o => o.BillingAddress, ba =>
{
ba.Property(a => a.Street).HasColumnName("Bill_Street");
ba.Property(a => a.City).HasColumnName("Bill_City");
});
}这样生成的表里,Order 表会包含 Ship_Street、Bill_City 等字段,没有额外表。
如果一个实体要拥有多个值对象(比如客户有多个联系地址),用 OwnsMany:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public List<Address> Addresses { get; set; } = new();
}配置方式类似:
modelBuilder.Entity<Customer>()
.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使用教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号