Avere un modello Thread
che dovrebbe contenere tutti gli attributi di un altro modello chiamato Post
I usa l'ereditarietà:
class Post {
public int Id{get;set;}
public string Title{get;set;}
// ...
}
class Thread: Post {
public int ForumId{get;set;}
// ...
}
EF Core inserisce entrambi in una singola tabella e aggiunge la colonna Discriminator
. Contiene il nome della classe, in modo che .NET Core possa serializzarlo sul tipo corretto.
Il mio obiettivo è:
Post
con tutti gli attributi del modello Post
Thread
con tutti gli attributi dei modelli Thread
e Post
Thread
che sono sempre vuote nelle righe Post
DbSet<T>
nel mio DbContext
per Post
e Thread
builder.Entity<Post>().ToTable("Post")
in OnModelCreating
per ogni entità [Table("Post")]
decoratore sulla definizione della classe Post
e Thread
ereditino da esso L'ultimo funziona:
class Content {
// Shared Attributes like Title
}
class Post: Content {}
class Thread: Content {}
Ma questo causa problemi quando si collegano le entità.
Quello che stai descrivendo è chiamato TPC, o modello di tipo Table-Per-Concrete, relazionale e al momento non è supportato in Entity Framework Core. Puoi seguire il problema correlato qui .
Al momento non esiste alcuna pietra miliare per questa funzione, quindi se devi assolutamente eseguire TPC, l'unica scelta è utilizzare EF6 o un altro ORM alternativo che supporti questa strategia relazionale, anziché EF Core.
Personalmente, consiglierei di attenersi a EF Core e semplicemente di usare le strategie relazionali TPH (Table-Per-Hierarchy) o TPT (Table-Per-Type). Il primo è in realtà l'impostazione predefinita e genererà una singola tabella per entrambi, con una colonna Discriminator
che indica il tipo effettivo. Quest'ultimo è ciò che si ottiene quando si utilizza la configurazione fluente di ToTable
o l'attributo [Table]
e si ottiene una tabella per il tipo di base che ToTable
tutte le proprietà condivise e quindi una tabella per ciascun tipo derivato, contenente solo le proprietà per tale digitare, con una chiave esterna di nuovo alla tabella del tipo di base. C'è una forte relazione tra qualcosa come un post e un thread, e c'è un valore nel mantenere effettivamente quella relazione a livello di database.