Добавьте поле дискриминатора таблицы по умолчанию в сущности — Поле дискриминатора равно нулю

#asp.net-core #entity-framework-core #ef-core-5.0

Вопрос:

У меня есть таблица для каждой архитектуры иерархии, и поэтому по умолчанию в мои таблицы добавлено поле дискриминатора, которое является переменным. Я пытаюсь добавить это поле в свои сущности и отправить его обратно клиенту в 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);
});
 

Но когда я получаю запрос POST с a GroceryItemEstablishment в данных, поле GroceryItemEstablishment имеет значение null Discriminator , но его veganItem , которое является полем на нем, имеет заполненное Discriminator поле. Есть идеи, почему один из них равен нулю?

введите описание изображения здесь
введите описание изображения здесь

Он заполнен в базе данных:

введите описание изображения здесь

Комментарии:

1. Это случайно не появилось? Если нет, возможно ли, что в каком-то месте пропущена конфигурация?

2. @TinyWang, Когда он поступает со стороны клиента, он, кажется, заполняет дискриминатор в моих контроллерах серверной части, даже если клиент его не отправлял, для GroceryItem , но не GroceryItemEstablishment для . Таким образом, это должно быть какое-то основное волшебство EF, которое работает автоматически из-за конфигурации этих сущностей. Так что да, я думаю, что мой GroceryItemEstablishment как-то неправильно настроен. В конце концов я просто отправил его со стороны клиента в качестве обходного пути, однако все равно было бы неплохо узнать, почему один класс работал, а другой нет.