2010-06-30 11 views
9

Wie stellen Sie eine Viele-zu-Viele-Beziehung im EF4 Code-First CTP3 dar?Viele-zu-viele-Beziehung in Code-First EF4

Zum Beispiel, wenn ich die folgenden Klassen:

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Profile> Profiles { get; set; } 
} 

class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

In der Datenbank gibt es eine Tabelle, die die Userprofiles FK für Benutzer und FK für Profil hat. Wie kann ich das abbilden?

EDIT: Ich verstehe, wie man derzeit mit einer ICollection<User> Eigenschaft auf der Profile Karte, aber ich will wirklich nicht eine entgegengesetzte Navigationseigenschaft haben, wenn es "Benutzer haben viele Profile" sein sollte.

Antwort

8

EDIT: CTP4 wurde veröffentlicht spät gestern (14. Juli 2010), und es gibt unterstützen jetzt das:

modelBuilder.Entity<Post>().HasMany(p => p.Tags).WithMany();


fand ich heraus, schließlich, dass dies derzeit nicht der Fall ist möglich. Microsoft möchte dieses Feature hinzufügen (nur eine Navigationseigenschaft).

Siehe diesen Link auf den MSDN-Foren für weitere Informationen: http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f

+3

Froh, dass sie das endlich umgesetzt haben. Ich musste feststellen, dass ich unerwünschte Navigationseigenschaften hinzufügen musste, um dieses Problem zu umgehen. Code-First kommt gut voran! – djskinner

+0

@Daniel - Einverstanden. – TheCloudlessSky

5

Mit vielen Beziehungen viele Sie sollten Navigationseigenschaften auf beiden Seiten umfassen und sie virtuell machen (verzögertes Laden zu nutzen)

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

Dann können Sie mit dieser Einstellung Ihre Viele-zu-Viele-Beziehung definieren (Sie können auch Entity Framework das für Sie tun lassen, aber ich mag die Benennungskonventionen, die es verwendet.)

 modelBuilder.Entity<Profile>(). 
      HasMany(p => p.Users). 
      WithMany(g => g.Profiles). 
      Map(t => t.MapLeftKey("ProfileID") 
       .MapRightKey("UserID") 
       .ToTable("UserProfiles")); 

Dadurch erhalten Sie eine Tabelle namens UserProfiles mit UserID und ProfileID als Schlüssel.