Attualmente sto usando il modello semplice sotto. È piuttosto semplice: abbiamo risorse e possono essere Room
, EmptyOffice
(...) o Service
.
Room
e EmptyOffice
possono avere una capacità, ma NON Service
.
public abstract class Resource : Entity
{
public string Name { get; set; }
}
public class Room : Resource
{
public int Capacity { get; set; }
}
public class EmptyOffice : Resource
{
public int Capacity { get; set; }
}
public class Service : Resource
{ }
Per ottenere i dati dalla mia vista SQL, utilizzo i mapping:
builder.Entity<Resource>(m =>
{
m.ToTable("resource", "facility");
m.HasKey(x => x.Id);
m.Property(x => x.Id)
.HasColumnName("ResourceId");
m.Property(x => x.Type)
.HasColumnName("ResourceTypeId");
m.HasDiscriminator(x => x.Type)
.HasValue<Room>(ResourceType.Room)
.HasValue<EmptyOffice>(ResourceType.EmptyOffice)
.HasValue<Service>(ResourceType.Service);
});
builder.Entity<Room>();
builder.Entity<EmptyOffice>();
builder.Entity<Service>();
Quando eseguo il mio codice, EF Core lancia la seguente eccezione:
System.Data.SqlClient.SqlException: 'Nome colonna non valido' Room_Capacity '.'
Se rinominare la proprietà Capacity
in Room_Capacity
, funziona ma è orribile.
Come posso forzare EF Core 2.0 a indirizzare la proprietà di capacità per ciascuna delle mie entità figlio?
Grazie Sebastien
Non è possibile farlo poiché l'unico modello di ereditarietà disponibile in EF Core è la tabella per gerarchia di classi. Se vai con le interfacce invece delle classi base, puoi, ma ogni entità verrà mappata su una tabella diversa. Segna tutte le proprietà che vuoi escludere con [NotMapped], oppure, usando il codice, con Ignora.
Questo ha funzionato per me:
builder.Entity<Room>().Property(a => a.Capacity).HasColumnName("Capacity");
builder.Entity<EmptyRoom>().Property(a => a.Capacity).HasColumnName("Capacity");