9

Verwenden des ersten Datenbankmodells: Nehmen wir an, wir haben die klassischen Tabellen Student, Course und StudentCourse (letzterer hat offensichtlich FKs zu Student und Course).Kann Entity Framework viele bis viele Beziehungen ohne ein Kreuzungsobjekt behandeln?

Wenn Sie dieses Modell in EF importieren, wird für jedes ein Objekt generiert. Die Student und Course Klassen haben jeweils eine Sammlung von StudentCourses, von denen Sie eine andere Beziehung springen müssen, um zu Course bzw. Student zu gelangen.

Ich möchte den Code haben derart erzeugt wird, dass die darunter liegende Kreuzungstabelle unsichtbar ist, das heißt eine Sammlung von StudentCourses hat und Course hat eine Sammlung von Students. Ich habe das in anderen ORM-Software (speziell TopLink) gesehen. Kann es in EF gemacht werden?

+0

Also nur das 'table1table2' Modell ausnehmen? –

+0

Es ist sicherlich mit Code-First möglich, also würde ich annehmen, dass es mit Datenbank zuerst möglich ist. –

+1

Hat Ihre 'StudentCourses' Tabelle zusätzliche Spalten? Dieser Artikel scheint zu suggerieren, dass Sie das gewünschte Verhalten erhalten, wenn dies nicht der Fall ist: http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ –

Antwort

9

Gemäß this tutorial erhalten Sie das gewünschte Verhalten, wenn Ihre StudentCourse Tabelle nur die Fremdschlüsselspalten enthält. Wenn es andere Spalten enthält, erzeugt EF eine Zwischeneinheit zur Darstellung des Joins.

In diesem Fall sollte das Ersetzen des Ersatzschlüssels aus der Tabelle StudentCourse und das Ersetzen durch einen zusammengesetzten Primärschlüssel funktionieren.

+0

Leben Retter Antwort ... – Javier

+2

Grundsätzlich, immer wenn Sie eine zusätzliche "Attribut" auf die Beziehung haben, erhalten Sie die zusätzliche Einheit in EF. Sie müssen sich nur den Ersatzschlüssel als "Attribut" vorstellen. Die andere Seite der Medaille ist, dass, wenn Sie Attribute wollen, diese zusätzliche Entität ein Musthave ist. (Denken Sie an die Beziehung zwischen Employee und JobTitle, aber die Beziehung ~ hat ein Attribut "StartedOnDate". Sie müssen also diese zusätzliche Entität haben. – granadaCoder

-3

Sie können es in EF Code zuerst mit ICollections tun. Zum Beispiel:

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>(); 
    } 
} 

Wiederholen Sie für Kurs und tauschen Sie alles um. Dadurch werden drei Tabellen in Ihrer Datenbank (Student, Course und StudentCourse) mit einer m-to-m-Beziehung erstellt. Am wichtigsten ist, dass StudentCourse eine unsichtbare Verknüpfungstabelle ist, die keine Entity in Ihrem Modell hat.

+0

Es gibt eine Ladung Scuttlebutt im Internet darüber. Der nützlichste Artikel, den ich fand, war dieser von [Prashant Brall] (http://prashantbrall.wordpress.com/2011/03/23/ef-code-first-managing-relationships/). – markp3rry

+0

Korrekt, solange die ~ -Beziehung keine zusätzlichen Attribute enthält. Sehen Sie meinen Kommentar zur richardwürdigen Antwort. – granadaCoder

Verwandte Themen