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()
.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).H
asColumnName("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 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、不单独存,只依附于拥有者存在。
# class
# 对象
# 数据库
# 多个
# 主键
# 不需要
# 两种
# 设为
# 用了
# 收货
# 重写
# 这是个
# 怎么处理
相关文章:
昆明高端网站制作公司,昆明公租房申请网上登录入口?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
活动邀请函制作网站有哪些,活动邀请函文案?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
视频网站制作教程,怎么样制作优酷网的小视频?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
ui设计制作网站有哪些,手机UI设计网址吗?
重庆市网站制作公司,重庆招聘网站哪个好?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
招商网站制作流程,网站招商广告语?
宝塔Windows建站如何避免显示默认IIS页面?
婚礼视频制作网站,学习*后期制作的网站有哪些?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何在建站之星网店版论坛获取技术支持?
公司网站设计制作厂家,怎么创建自己的一个网站?
大型企业网站制作流程,做网站需要注册公司吗?
内网网站制作软件,内网的网站如何发布到外网?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何在西部数码注册域名并快速搭建网站?
如何快速搭建二级域名独立网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
MySQL查询结果复制到新表的方法(更新、插入)
如何在七牛云存储上搭建网站并设置自定义域名?
如何在腾讯云服务器上快速搭建个人网站?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
广德云建站网站建设方案与建站流程优化指南
郑州企业网站制作公司,郑州招聘网站有哪些?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何通过网站建站时间优化SEO与用户体验?
如何选择高效便捷的WAP商城建站系统?
韩国服务器如何优化跨境访问实现高效连接?
太原网站制作公司有哪些,网约车营运证查询官网?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
C++时间戳转换成日期时间的步骤和示例代码
,怎么用自己头像做动态表情包?
,柠檬视频怎样兑换vip?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站之星导航配置指南:自助建站与SEO优化全解析
建站10G流量真的够用吗?如何应对访问高峰?
如何快速搭建自助建站会员专属系统?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
建站之星2.7模板:企业网站建设与h5定制设计专题
北京企业网站设计制作公司,北京铁路集团官方网站?
网站微信制作软件,如何制作微信链接?
如何在建站宝盒中设置产品搜索功能?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
小型网站建站如何选择虚拟主机?
如何在橙子建站上传落地页?操作指南详解
*请认真填写需求信息,我们会在24小时内与您取得联系。