全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

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 最省事,自动实现 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 Code Reviewer

AI自动审核代码

AI Code Reviewer 112 查看详情 AI Code Reviewer
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  # 宠物网站的推广方式  # 青山区网络推广网站建设  # 多个  # 收货  # 解决问题  # 中文网  # 用了  # 相关文章  # 设为  # 两种  # 不需要  # 主键 


相关文章: 漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  在Qt QML中通过Python字典动态更新TextEdit内容的教程  J*aScript:在map操作中高效处理空数组  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  蛙漫2台版漫画地址 Manwa2正版网页版链接  mc.js官网登录入口 mc.js官方登录入口最新版  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  理解J*aScript Promise的微任务队列与执行顺序  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  J*a 递归快速排序中静态变量的状态管理与陷阱  React列表渲染与独立状态管理:避免全局状态影响局部更新  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  黑猫投诉统一入口官网 消费者权益保护投诉平台  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  Win11怎么开启省电模式_Win11电池节电模式自动开启  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  c++如何使用Meson构建系统_c++比CMake更快的构建工具  Python复杂任务中断策略:通过回调函数实现优雅停止  Python getattr() 异常处理深度解析:避免程序意外退出  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  如何配置Composer的PSR-4自动加载_Composer自动加载命名空间映射实践教程  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  抖音网页版平台入口 抖音网页版官网在线访问教程  QQ官网正版登录链接 QQ在线登录入口最新  在python-socketio事件处理器中安全访问Flask应用上下文  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  必由学在线入口 必由学网页版快速登录入口  Golang如何使用const iota_Go iota常量计数器讲解  将JSON对象数组转置为键值对列表的实用指南  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  Python Socket多播通信中指定源IP地址的实践指南  Golang如何使用new_Go new分配内存机制讲解  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  高德地图怎么看全景照片_高德地图全景照片浏览教程  邮政快递单号查询入口 邮政快递物流信息在线查询入口  163邮箱注册官网 免费申请163个人邮箱  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  Pandas DataFrame:高效添加条件计算列 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。