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

