0

0

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

小老鼠

小老鼠

发布时间:2025-10-17 17:11:01

|

766人浏览过

|

来源于php中文网

原创

复杂类型是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来配置复杂类型。

Napkin AI
Napkin AI

Napkin AI 可以将您的文本转换为图表、流程图、信息图、思维导图视觉效果,以便快速有效地分享您的想法。

下载
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .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
Addresses { get; set; } = new List
(); }
modelBuilder.Entity()
    .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
    ()
    )。
  • 建议将复杂类型设计为不可变或值语义清晰的类。

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

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

352

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2075

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

410

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

401

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

221

2023.10.19

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.3万人学习

Go 教程
Go 教程

共32课时 | 4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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