首页 > 解决方案 > 将默认表鉴别器字段添加到实体 - 鉴别器字段为空

问题描述

我有一个按层次结构的表架构,因此默认情况下我将鉴别器字段添加到我的表中,这是一个 varchar。我正在尝试将此字段添加到我的实体并在 http 响应中将其发送回客户端。

我已将其添加到我的基本实体中:

[Serializable]
public abstract class DomainEntity<TId> : IDomainEntity<TId>
{
    [Key]
    public TId Id { get; set; }
    public string Discriminator { get; set; }
}

在数据上下文中:

// Vegan Item (this is an abstract class with several concrete subclasses)

modelBuilder.Entity<VeganItem>(veganItem =>
{
    veganItem.HasIndex("CompanyName", "Name", "Discriminator").IsUnique();
    veganItem.HasDiscriminator<string>("Discriminator");
    veganItem.Property(u => u.CreatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    veganItem.Property(u => u.UpdatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    veganItem.HasKey(e => e.Id);
    veganItem.HasOne(q => q.UpdatedBy)
        .WithMany()
        .HasForeignKey(k => k.UpdatedById);
    veganItem.HasOne(q => q.CreatedBy)
        .WithMany()
        .HasForeignKey(k => k.CreatedById);
    veganItem.Property(e => e.Tags)
        .HasConversion(
            v => JsonSerializer.Serialize(v, null),
            v => JsonSerializer.Deserialize<List<Option>>(v, null),
            new ValueComparer<IList<Option>>(
                (c1, c2) => c1.SequenceEqual(c2),
                c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
                c => (IList<Option>)c.ToList()));
});

// Vegan Item Establishments (these are concrete classes, I just had to do it that way to get the generics right.)

modelBuilder.Entity<GroceryItemEstablishment>(giEstablishment => 
{
    giEstablishment.HasIndex(g => new { g.VeganItemId, g.EstablishmentId }).IsUnique();
    giEstablishment.HasDiscriminator<string>("Discriminator");
    giEstablishment.Property(u => u.CreatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    giEstablishment.Property(u => u.UpdatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    giEstablishment.HasOne(g => g.VeganItem)
        .WithMany(vi => vi.VeganItemEstablishments)
        .HasForeignKey(g => g.VeganItemId);
    giEstablishment.HasOne(g => g.Establishment)
        .WithMany(e => e.VeganItemEstablishments)
        .HasForeignKey(g => g.EstablishmentId);
    giEstablishment.HasOne(q => q.UpdatedBy)
        .WithMany()
        .HasForeignKey(k => k.UpdatedById);
    giEstablishment.HasOne(q => q.CreatedBy)
        .WithMany()
        .HasForeignKey(k => k.CreatedById);
});

modelBuilder.Entity<MenuItemEstablishment>(miEstablishment => 
{
    miEstablishment.HasIndex(m => new { m.VeganItemId, m.EstablishmentId }).IsUnique();
    miEstablishment.Property(u => u.CreatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    miEstablishment.HasDiscriminator<string>("Discriminator");
    miEstablishment.Property(u => u.UpdatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP"); 
    miEstablishment.HasOne(m => m.VeganItem)
        .WithMany(vi => vi.VeganItemEstablishments)
        .HasForeignKey(m => m.VeganItemId);
    miEstablishment.HasOne(m => m.Establishment)
        .WithMany(e => e.VeganItemEstablishments)
        .HasForeignKey(m => m.EstablishmentId);
    miEstablishment.HasOne(q => q.UpdatedBy)
        .WithMany()
        .HasForeignKey(k => k.UpdatedById);
    miEstablishment.HasOne(q => q.CreatedBy)
        .WithMany()
        .HasForeignKey(k => k.CreatedById);
});

GroceryItemEstablishment但是当我在数据中收到一个带有 a 的 POST 请求时,它GroceryItemEstablishment有一个空Discriminator字段,但它veganItem是一个字段,它有一个填充Discriminator字段。任何想法为什么其中一个为空?

在此处输入图像描述 在此处输入图像描述

它填充在数据库中:

在此处输入图像描述

标签: asp.net-coreentity-framework-coreef-core-5.0

解决方案


推荐阅读