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

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);
    }
}

关键说明

  1. 拥有实体的特性:

    • 无需为Price单独定义DbSet,EF会自动将其与Item关联,处理查询、插入、更新操作
    • 完美适配DB-First模式,所有映射规则手动对应现有数据库的列结构
    • EF Core 5及以上版本完全支持将record类型作为拥有实体
  2. 为什么不用HasConversion:

    • HasConversion的转换逻辑只能访问当前列的值,无法获取同一实体的其他列数据,因此没法同时结合ITM_Price和ITM_Currency构建Price实例

内容的提问来源于stack exchange,提问作者Fabian Koziołek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:27:51