2010-06-30 10 views
9

W jaki sposób reprezentujesz relację wiele do wielu w Kodzie EF4 - pierwsze CTP3?Stosunek wielu do wielu w kodzie-pierwszym EF4

Na przykład jeśli mam następujących klas:

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

w bazie danych znajduje się stół UserProfiles który ma FK FK dla użytkownika i dla profilu. Jak mogę to odwzorować?

EDYCJA: Rozumiem, jak obecnie mapować mając właściwość ICollection<User> na Profile, ale naprawdę nie chcę mieć przeciwnej właściwości nawigacji, kiedy powinno być "Użytkownicy mają wiele profili".

Odpowiedz

8

EDIT: CTP4 został wydany późno wczoraj (14 lipca 2010) i tam jest teraz wsparcie dla tego:

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


dowiedziałem się wreszcie, że obecnie nie jest możliwy. Microsoft chce dodać tę funkcję (tylko jedna właściwość nawigacji).

Zobacz ten link na forum MSDN uzyskać więcej informacji: http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f

+3

Cieszę się, że w końcu zaimplementowali to. Aby obejść ten problem, musiałem dodać niechciane właściwości nawigacyjne. Code-First ładnie przychodzi! – djskinner

+0

@Daniel - Uzgodnione. – TheCloudlessSky

5

Z wielu do wielu relacji należy uwzględnić właściwości nawigacji po obu stronach i uczynić je wirtualny (aby wykorzystać leniwy załadunku)

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

Następnie za pomocą tej konfiguracji możesz zdefiniować wiele do wielu relacji (możesz także pozwolić, aby struktura elementów zrobiła to za Ciebie, ale nie podoba mi się konwencja nazewnictwa, której używa).

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

Zostanie wyświetlona tabela o nazwie UserProfiles z identyfikatorem użytkownika i identyfikatorem profilu jako kluczami.

Powiązane problemy