#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
как-то неправильно настроен. В конце концов я просто отправил его со стороны клиента в качестве обходного пути, однако все равно было бы неплохо узнать, почему один класс работал, а другой нет.