EF Core值转换:DB-First下多列映射为单个记录的实现
解决方案:多列映射到嵌套Price记录类型(EF Core DB-First)
EF Core 的HasConversion仅支持单个属性与单个数据库列的双向转换,无法同时关联另一列的值,所以你当前的写法没法获取ITM_Currency来构建Price实例。要实现多列映射到单个复杂类型属性,正确方式是使用拥有实体(Owned Entity Type),可直接在Item的配置中完成,无需为Price单独创建独立配置。
具体配置代码
public class ItemConfiguration : IEntityTypeConfiguration<Item> { public void Configure(EntityTypeBuilder<Item> builder) { // 映射Name字段 builder.Property(e => e.Name) .HasColumnName("ITM_Name"); // 配置Price为拥有实体,映射到数据库的两列 builder.OwnsOne(e => e.Price, priceBuilder => { // 映射Price.Value到ITM_Price priceBuilder.Property(p => p.Value) .HasColumnName("ITM_Price") .HasColumnType("decimal(25, 6)") .IsRequired(); // 根据实际业务设置是否必填 // 映射Price.Currency到ITM_Currency priceBuilder.Property(p => p.Currency) .HasColumnName("ITM_Currency") .HasMaxLength(3); // 按需调整长度,比如ISO货币代码常用3位 }); // 配置主键 builder.HasKey(e => e.Id); } }
关键说明
拥有实体的特性:
- 无需为
Price单独定义DbSet,EF会自动将其与Item关联,处理查询、插入、更新操作 - 完美适配DB-First模式,所有映射规则手动对应现有数据库的列结构
- EF Core 5及以上版本完全支持将
record类型作为拥有实体
- 无需为
为什么不用
HasConversion:HasConversion的转换逻辑只能访问当前列的值,无法获取同一实体的其他列数据,因此没法同时结合ITM_Price和ITM_Currency构建Price实例
内容的提问来源于stack exchange,提问作者Fabian Koziołek
相关产品推荐
相关产品推荐

