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

EF Core 映射复杂类型,核心就是用 Owned Entity Types(自有实体类型),它本质是官方对“值对象”的原生支持。不是新建表,也不是普通导航属性,而是把值对象的字段直接展平到拥有者的数据库表里。
怎么定义一个值对象类
值对象要体现“无标识、按值比较、不可变(推荐)”的特点:
- 用 record 最省事,自动实现
Equals和GetHashCode - 或者用普通 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+ 支持)
推荐用代码配置,更清晰可控:
AI Code Reviewer
AI自动审核代码
112
查看详情
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使用教程的详细内容,更多请关注其它相关文章!
# 石家庄产品推广网站建设
# 三林镇网站竞价推广
# 电影网站建设推广
# 安康广东网站推广
# 群力大型网站建设电话
# 英山seo对比
# 永春推广网站价格多少
# 邯郸爱博SEO
# 宠物网站的推广方式
# 青山区网络推广网站建设
# 多个
# 收货
# 解决问题
# 中文网
# 用了
# 相关文章
# 设为
# 两种
# 不需要
# 主键
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
J*aScript中正确使用querySelectorAll与复杂CSS选择器
C++ vector二维数组定义_C++ vector of vector用法
照顾宝贝2小游戏点击立即在线玩
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
AO3官方在线访问地址 Archive of Our Own最新镜像合集
React Router 嵌套组件中 URL 重定向问题的解决方案
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
uc浏览器网页版入口 uc浏览器网页版最新网址
J*aScriptWebpack优化_J*aScript构建工具实战
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
快手赚钱渠道_快手收益来源
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
AngularJS $http POST请求数据传递与Go后端接收实践
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
如何在网页中实现特定地点的随机图片展示
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
如何将HTML表格多行数据保存到Google Sheet
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
AO3最新可访问网址 Archive of Our Own官方在线入口
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
网易大神账号申诉需要多久_网易大神账号申诉流程说明
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
妖精动漫免费平台 妖精动漫官网资源观看网址
J*aScript中针对特定容器内图片动画的实现教程
excel如何生成目录 excel一键生成工作表目录超链接
J*a实现学校排课程序_面向对象结构化项目示例
深入理解J*a合成构造器:何时以及为何阻止其生成
AO3镜像入口大全 AO3网页版内容访问全集
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
mcjs网页版在线存档 mcjs云存档登录入口
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池


2025-12-15
浏览次数:次
返回列表
public int Id { get; set; }
public string Name { get; set; }
public List<Address> Addresses { get; set; } = new();
}