2013-03-01 12 views
23

Mam wiele do wielu relacji i chcę przechowywać dodatkowe dane w paragrafie przy użyciu Code First Fluent API.Wiele do wielu mapowania z dodatkowymi polami w Fluent API

Jak można to osiągnąć?

Mój model:

Użytkownik może mieć 1 lub więcej identyfikatorów (opcjonalnie), odznaka może należeć do jednej lub większej liczby użytkowników (opcjonalnie). Chcę zapisać dodatkowe pole (zwane B), aby relacja ta była przechowywana. Stół powinien być nazwany UserBadges z następujących dziedzin: userid, BadgeId, B

(widziałem to wcześniej w StackOverflow here, ale model jest nieco skomplikowane i brak odpowiedzi nadano jeszcze poprawnie)

Odpowiedz

43

Nie możesz mapować go jako wiele-do-wielu bezpośrednio. Jeśli dodać dodatkowe pola do stołu przyłączeniowej i chcesz uzyskać dostęp do tego pola we wniosku trzeba promować swoją tabelę połączeniową do podmiotu i zamiast używać dwóch jeden-do-wielu relacjach:

public class Badge { 
    ... 
    public virtual ICollection<UserBadge> UserBadges { get; set; } 
} 

public class User { 
    ... 
    public virtual ICollection<UserBadge> UserBadges { get; set; } 
} 

public class UserBadge { 
    public int UserId { get; set; } 
    public int BadgeId { get; set; } 
    public string B { get; set; } 
    public virtual Badge Badge { get; set; } 
    public virtual User User { get; set; } 
} 

domyślnej konwencjach powinny poprawnie zdefiniuj mapowanie, oprócz klucza dla tabeli UserBadge, które należy wykonać w Fluent-API lub adnotacjach danych.

modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId }); 
+1

Thx, ale wątpię, czy to działa, ponieważ definiujesz UserId i BadgeId jako złożoną PK. Powinno być możliwe posiadanie 2 rekordów z tym samym identyfikatorem UserId i BadgeId, wartość B ma inną wartość (jest to FK do innej tabeli). –

+0

@PatrickPeters: W takim przypadku musisz zdefiniować PK w różny sposób, ale punkt odpowiedzi jest wciąż taki sam - musisz odsłonić tabelę połączeń jako encję. –

+0

Tak, Ladislav, masz całkowitą rację. Naprawiłem to zgodnie z twoją odpowiedzią i to działa. –

Powiązane problemy