9

Sto cercando di capire i mapping di ereditarietà in EF4.Entity Framework 4 - Eredità

mio database ha due tabelle con la seguente struttura:

PersonCategory Tabella:

  • IDCategoria (int) (identità) (PK)
  • CategoryType (nvarchar (50))

Persona Tabella

  • PersonID (int) (identità) (PK)
  • IDCategoria (FK da tavolo PersonCategory)
  • Nome (nvarchar (50))
  • Descrizione (nvarchar (max))

PersonCategory table ha quattro voci ciascuna che rappresentano una categoria: Student, CourseInstructor, Staff e Advisor.

Dalla lettura articles online ho pensato Tabella per gerarchia sarà un modello adatto per questo scenario. Quindi in EF4, ho creato quattro entità (Student, CourseInstructor, Staff e Advisor) ciascuna che eredita dalla tabella Person. Ho quindi mappato ciascuno di essi alla tabella Persona e ho aggiunto una condizione a ciascuno (ad esempio IDCategoria = 1 per Entità studente e IDCategoria = 2 per l'entità Staff) per differenziarli dagli altri. Ho anche rimosso la proprietà CategoryID dalla tabella Person e l'ho resa astratta. Ma sto ottenendo il seguente errore perché ho cancellato la proprietà CategoryId dalla tabella Persona.

Errore 3015: Problema in frammenti di mappatura a partire dalle linee 101, 108, 114, 120, 126, 133: vincolo di chiave esterna '' FK_Person_PersonCategory da persona tavolo (IDCategoria) a tavolo PersonCategory (CategoryID) :: mappatura insufficiente : La chiave esterna deve essere associata ad alcuni AssociationSet o EntitySet che partecipano a un'associazione di chiavi esterne sul lato concettuale.

Tabella per gerarchia è un modello adatto per questo scenario? Altrimenti, come devo affrontare questo scenario in EF4?

risposta

5

L'utilizzo di colonne discriminatorie nelle associazioni è problematico. Vedi: -

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/24380ee6-4753-46a2-a3ed-b1cb2e2d161c

"Il punto chiave è una colonna che fungerà discriminatore non può essere mappata su un assocation meno che particpates in condizione non nullo."

+0

Grazie per il puntatore. Capisco il punto spiegato. Devo interpretare questo come EF4 non può gestire questa situazione? Perché nel modello di entità della mia applicazione voglio che entrambe le tabelle siano presenti con un'associazione. Come potrei avvicinarmi a questo scenario? – muruge

0

Per la tabella-per-gerarchia, una singola tabella contiene tutte le colonne per tutti i tipi. Hai due tavoli, quindi sono immediatamente sospettoso.

Se si utilizza Table-per-Type, non è corretto.Saresti in grado di avere solo due tipi, base e derivati, con la tabella PersonCategory che fornisce i dati per i valori delle proprietà del tipo derivato. Ma questo dovrebbe avere il PersonID come chiave esterna, che non è così.

Personalmente, penso che stai inutilmente frammentando le tue entità in diversi tipi. È possibile mappare tutte le colonne di entrambe le tabelle a un'entità oppure, se possibile, modificare lo schema del database in base alle proprie esigenze.

Suggerirei di lavorare con un database di test vuoto e di fare i primi modelli del modello TPT e TPH e guardare lo schema che EF costruisce per la configurazione desiderata.

Luke