9

Utilizzo del primo modello del database: diciamo che abbiamo le classiche tabelle, Course e StudentCourse (quest'ultimo ovviamente con FK a Student e Course).È possibile che Entity Framework gestisca relazioni molte a molte senza un oggetto intersezione?

Se si importa questo modello su EF, si otterrà un oggetto generato per ognuno di essi. Le classi Student e Course avranno ciascuna una collezione di StudentCourses, da cui è necessario saltare un'altra relazione per raggiungere lo Course o Student, rispettivamente.

Vorrei avere il codice generato in modo tale che la tabella sottostante intersezione è invisibile, cioè Student ha una collezione di Courses e Course ha una collezione di Students. Ho visto questo fatto in altri software ORM (in particolare, TopLink). Può essere fatto in EF?

+0

Quindi, basta esentare il modello 'table1table2'? –

+0

È certamente possibile con codice prima, quindi suppongo sia possibile con il database-first. –

+1

La tabella 'StudentCourses' ha colonne aggiuntive? Questo articolo sembra suggerire che otterrai il comportamento desiderato se non lo fa: http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ –

risposta

9

Secondo this tutorial, si otterrà il comportamento desiderato se la tabella StudentCourse contiene solo le colonne chiave esterna. Se contiene altre colonne, EF genererà un'entità intermedia per rappresentare il join.

In questo caso, è necessario eliminare la chiave surrogata dalla tabella StudentCourse e sostituirla con una chiave primaria composta.

+0

risposta salvavita ... – Javier

+2

Fondamentalmente, ogni volta che si ha un "attributo" extra sulla relazione, si otterrà l'entità extra in EF. Devi solo pensare alla chiave surrogata come a un "attributo". L'altro lato della medaglia è che se vuoi attributi, questa entità extra è un must. (Pensa alla relazione Employee to JobTitle, ma la relazione ~ ha un attributo "StartedOnDate". Quindi devi avere questa entità extra. – granadaCoder

-3

È possibile farlo in codice EF prima utilizzando ICollections. Ad esempio:

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Course> Courses { get; set; } 

    public Student() 
    { 
     Courses = New HashSet<Course>(); 
    } 
} 

Ripetere per corso e scambiare tutto. Questo creerà tre tabelle nel tuo database (Student, Course e StudentCourse) con una relazione m-to-m. Soprattutto, StudentCourse sarà una tabella di collegamento invisibile che non ha Entità nel modello.

+0

C'è un carico di scuttlebutt sul web a riguardo. L'articolo più utile che ho trovato è stato quello di [Prashant Brall] (http://prashantbrall.wordpress.com/2011/03/23/ef-code-first-managing-relationships/). – markp3rry

+0

Corretto, purché la relazione ~ non abbia attributi aggiuntivi. Vedi il mio commento sulla risposta che ricambia. – granadaCoder