Ho le seguenti entità:
public abstract class Freezer
{
public int FreezerId { get; set; }
public string Name { get; set; }
public int FreezerTypeId { get; set; }
public int Capacity { get; set; }
}
public class FoodFreezer : Freezer
{
public List<FoodItem> Foods { get; set; }
}
public class ChemicalFreezer : Freezer
{
public List<ChemicalItem> Chemicals { get; set; }
}
Come puoi vedere le classi Freezer
derivate non contengono dati che verrebbero archiviati nel database; contengono solo una proprietà di navigazione dei tipi specifici di contenuti.
Ho le seguenti configurazioni:
internal class FreezerConfiguration<T> : DbEntityConfiguration<T> where T : Freezer
{
public override void Configure(EntityTypeBuilder<T> builder)
{
builder.ToTable("Freezers");
builder.HasKey(x => x.FreezerId);
builder.Property(x => x.FreezerId).IsRequired();
builder.Property(x => x.Name).IsRequired();
builder.Property(x => x.FreezerTypeId).IsRequired();
builder.Property(x => x.Capacity).IsRequired();
}
}
internal class FoodFreezerConfiguration : FreezerConfiguration<FoodFreezer>
{
public override void Configure(EntityTypeBuilder<FoodFreezer> builder)
{
builder.HasMany(x => x.FoodItems).WithOne(x => x.Freezer);
}
}
Quando FoodFreezer
una chiamata per ottenere un elenco di FoodFreezer
dal mio contesto, viene visualizzato un errore "Discriminator name" della colonna non valida. Dopo aver fatto qualche ricerca, sembra che non piaccia il fatto che FoodFreezer
e ChemicalFreezer
puntino a un unico tavolo. Cosa devo cambiare? Ho bisogno di una tabella di database FoodFreezers e ChemicalFreezers con solo una colonna FreezerId
che è un FK alla tabella Freezer?
@ haim770 mi ha guidato lungo la strada giusta. Ho dovuto aggiungere quanto segue al mio FreezerConfiguration
:
builder.HasDiscriminator(x => x.FreezerTypeId)
.HasValue<FoodFreezer>(FreezerTypeEnum.Food)
.HasValue<ChemicalFreezer>(FreezerTypeEnum.Chemical);
Non sono necessarie tabelle o codici aggiuntivi. Se provo a ottenere un FoodFreezer
usando l'ID di un ChemicalFreezer
, restituisce null
. Veramente cool.