如何在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
相关产品推荐
相关产品推荐

