You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Entity Framework中将对象内的结构体展平映射到MySQL数据库

Entity Framework保留结构体类型并映射其成员到数据库列

问题描述

我有一个包含结构体B及其他数据的类A,代码如下:

public class A
{
    public int Id      { get; set; }
    public string Name { get; set; }
    public B MyB       { get; set; }
}

public struct B
{
    public int Var1 { get; set; }
    public int Var2 { get; set; }
}

希望使用Entity Framework将类A序列化到MySQL数据库,要求每行数据格式如下:

Id | Name | MyB_Var1 | MyB_Var2

已知将B改为类并标记[Owned]可以实现该效果,但希望保留B的结构体类型,请问是否可以通过映射结构体内部成员到数据库列来实现?能否在DbContext的OnModelCreating()方法中指定映射以完成展平?

解决方案

可以实现,无需将结构体B改为类。EF Core 2.1及以上版本支持值类型(包括结构体)作为Owned Entity,你可以在OnModelCreating方法中通过OwnsOne配置来展平结构体成员到数据库列:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<A>()
        .OwnsOne(a => a.MyB, bBuilder =>
        {
            // 为结构体的每个成员指定对应的数据库列名
            bBuilder.Property(b => b.Var1).HasColumnName("MyB_Var1");
            bBuilder.Property(b => b.Var2).HasColumnName("MyB_Var2");
        });
}

说明

  • OwnsOne方法用于配置实体拥有的单个值类型(结构体)属性,EF Core会自动将该结构体的成员展平到当前实体的数据库表中,不会为结构体单独创建表。
  • 通过HasColumnName可以精准指定每个结构体成员对应的数据库列名,完全匹配你需要的格式。
  • 这种方式既保留了B的结构体类型,又实现了数据的展平存储,符合需求。

内容的提问来源于stack exchange,提问作者SimoGecko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:53:06