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

TPH架构下GroceryItemEstablishment实体Discriminator字段为空问题咨询

可能的原因及修复方案


1. Discriminator 配置未绑定到实体属性

你调用HasDiscriminator<string>("Discriminator")时仅传入了数据库字段名,EF Core 默认会将该字段识别为影子属性(Shadow Property),不会将数据库查询到的值自动赋值给你在DomainEntity中定义的Discriminator实体属性。
正确的配置需要显式绑定到实体属性:

// 绑定到基类定义的Discriminator属性
veganItem.HasDiscriminator<string>(x => x.Discriminator);
giEstablishment.HasDiscriminator<string>(x => x.Discriminator);
miEstablishment.HasDiscriminator<string>(x => x.Discriminator);

2. 子类重复配置Discriminator导致冲突

如果GroceryItemEstablishment、MenuItemEstablishment继承自同一个公共基类(比如VeganItemEstablishment),不应该在每个子类单独配置Discriminator,需要在父类层级统一配置,重复配置会导致EF Core映射逻辑混乱:

// 统一在父类配置Discriminator,子类不需要重复配置
modelBuilder.Entity<VeganItemEstablishment>(est =>
{
    est.HasDiscriminator<string>(x => x.Discriminator)
        .HasValue<GroceryItemEstablishment>(nameof(GroceryItemEstablishment))
        .HasValue<MenuItemEstablishment>(nameof(MenuItemEstablishment));
    // 公共字段、关联配置都放在父级,避免重复代码
    est.Property(u => u.CreatedDate).HasDefaultValueSql("CURRENT_TIMESTAMP");
    est.Property(u => u.UpdatedDate).HasDefaultValueSql("CURRENT_TIMESTAMP");
});

3. POST请求模型绑定逻辑问题

如果你说的Discriminator为null是指客户端POST提交的入参为null,属于正常现象:Discriminator是数据库/EF Core维护的字段,不需要客户端提交,你可以在保存数据前手动赋值,或者数据入库后重新查询返回给前端,就能拿到正确的字段值。
手动赋值参考:

groceryItemEstablishment.Discriminator = nameof(GroceryItemEstablishment);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:30:01