Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Entity Framework 4 Tabella per gerarchia - Come definire le proprietà di navigazione sui figli?

Quindi ho risolto alcuni dei miei problemi, ma ho sbattuto contro un muro di mattoni.

Prima di tutto, quando crei FK autoreferenziali sul lato database, quando provi ad "Aggiorna modello dal database", Entity Framework aggiungerà queste proprietà di navigazione al tipo di base principale, poiché non ha un senso esplicito di TPH:tu è necessario farlo sul lato modello.

MA puoi aggiungere manualmente le proprietà di navigazione ai tipi figlio.

Scrivi questo errore:

Questo perché avevo un FK chiamato "Location_State" che stavo tentando di utilizzare per la relazione "ZipCode_State" E la relazione "City_State" - che non funziona (ancora non ho idea del perché).

Quindi, per risolverlo, ho dovuto aggiungere colonne extra e FK extra - uno chiamato "ZipCode_State" e un altro chiamato "City_State" - ovviamente deve essere un 1-1 tra nav e FK fisici.

Questo è il mio campo discriminatore. Sul lato database, è non annullabile .

Ho letto discussioni su questo problema e hanno detto che è necessario modificare le relazioni da 0..* a 1..* - ma le mie relazioni erano già 1..*.

Se guardi la mia tabella del database effettiva "Posizioni" sopra, tutti gli FK sono annullabili (devono esserlo). Quindi ho iniziato a chiedermi se le mie relazioni dovrebbero essere 0..*.

Ma sono annullabili a causa del TPH:non tutte le "Località" avranno uno "Stato". Ma se quella Località è una "Città", allora DEVE avere uno "Stato".

I miei sentimenti sono stati ulteriormente confortati da questa domanda SO:ADO EF - Errori nella mappatura delle associazioni tra tipi derivati ​​in TPH

In realtà stavo provando quella soluzione alternativa (prima ancora di incontrarla) e la soluzione alternativa non funziona per me. Ho anche provato a cambiare tutte le relazioni da 1..* a 0..*, ma ancora senza fortuna.

Perdendo troppo tempo qui, sono tornato al TPT.

Alla fine della giornata, con TPH avrei avuto un tavolo ridicolmente grande, con un sacco di colonne ridondanti e nullable. JOIN-saggio, è più efficiente. Ma almeno con TPT non sono tenuto ad avere FK nullable e autoreferenziali.

Se qualcuno ha una soluzione a questo problema, me lo faccia sapere. Ma fino ad allora, rimarrò fedele a TPT.