C#中如何使用EF Core的复杂类型?如何定义?

小老鼠
发布: 2025-10-17 17:11:01
原创
744人浏览过
复杂类型是EF Core中用于建模值对象的机制,通过OwnsOne将无主键的类如Address嵌入实体如Order中,默认展平到主表;使用OwnsMany可支持一对多值对象集合,但会创建独立表并外键关联,适用于需结构化存储且无独立标识的场景。

c#中如何使用ef core的复杂类型?如何定义?

在C#中使用EF Core的复杂类型(Owned Types)是一种将值对象建模为实体一部分的有效方式。它允许你将一个类作为另一个实体的组成部分,而不需要独立的数据库表。

什么是复杂类型(Owned Type)?

复杂类型是EF Core中用于表示“拥有”关系的一种机制。它通常用于表示没有独立标识(即无主键)的值对象。例如,一个Address类可以作为OrderPerson的一部分存在,不单独存在表中。

如何定义复杂类型?

要定义一个复杂类型,首先创建一个普通的C#类,然后通过配置告诉EF Core该类是“被拥有的”。

示例:定义Address类作为复杂类型

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
}
登录后复制
public class Order
{
    public int Id { get; set; }
    public string OrderNumber { get; set; }

    // 这个属性将被映射为复杂类型
    public Address ShippingAddress { get; set; }
}
登录后复制

如何在DbContext中配置复杂类型?

使用OnModelCreating方法中的OwnsOne来配置复杂类型。

如知AI笔记
如知AI笔记

如知笔记——支持markdown的在线笔记,支持ai智能写作、AI搜索,支持DeepseekR1满血大模型

如知AI笔记27
查看详情 如知AI笔记
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .OwnsOne(o => o.ShippingAddress, sa =>
        {
            sa.Property(a => a.Street).HasColumnName("Shipping_Street");
            sa.Property(a => a.City).HasColumnName("Shipping_City");
            sa.Property(a => a.PostalCode).HasColumnName("Shipping_PostalCode");
            sa.Property(a => a.Country).HasColumnName("Shipping_Country");
        });
}
登录后复制

说明:

  • OwnsOne表示该实体拥有一个复杂类型的实例。
  • 你可以自定义列名和约束,避免字段名冲突(如多个地址)。
  • 默认情况下,EF Core会将所有属性展平到主表中,不会创建新表。

支持集合类型的复杂类型(OwnsMany)

如果你需要一个实体拥有多个复杂类型实例(例如订单有多个收货地址),可以使用OwnsMany

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Address> Addresses { get; set; } = new List<Address>();
}
登录后复制
modelBuilder.Entity<Customer>()
    .OwnsMany(c => c.Addresses, a =>
    {
        a.Property(addr => addr.Street).HasColumnName("Street");
        a.Property(addr => addr.City).HasColumnName("City");
        // 注意:OwnsMany会在单独的表中存储这些数据
    });
登录后复制

注意: OwnsMany虽然也是复杂类型,但EF Core会为其创建单独的表,并通过外键关联,因为它无法展平到单行中。

使用限制和注意事项

  • 复杂类型不能有主键(由EF Core自动管理)。
  • 不能被其他实体直接引用(除非也配置为拥有者)。
  • 不能被 DbSet 直接查询(不能写context.Set<address>()</address>)。
  • 建议将复杂类型设计为不可变或值语义清晰的类。

基本上就这些。只要合理使用OwnsOneOwnsMany,就能很好地建模领域中的值对象,让数据库结构更清晰。

以上就是C#中如何使用EF Core的复杂类型?如何定义?的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号