新闻中心

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

2025-12-15
浏览次数:
返回列表
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+ 支持)

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

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_StreetBill_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&#215;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连接池 

搜索