Masz jeden typ danych, który nazywasz osobnymi nazwami. To trochę mylące. Jednak aby to zadziałało najpierw z kodem, potrzebujesz tylko następującej konfiguracji płynnej w Twojej klasie Custom DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<user>().
HasMany(c => c.Buddies).
WithMany().
Map(
m =>
{
m.MapLeftKey("user_id");
m.MapRightKey("buddy_id");
m.ToTable("buddies");
});
}
Zakładając, że twoja klasa użytkownika wygląda tak:
[Table("user")]
public class user
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public virtual List<user> Buddies { get; set; }
}
Jeśli użyjesz powyższej metody, każdy obiekt użytkownika, który posiadasz, będzie miał właściwość nawigacyjną o nazwie Buddies. Pytając o użytkowników, będziesz chciał załadować znajomych znajomych , zrób:
context.users.Include("Buddies")
Ponadto, aby rozwiązać Twój problem z wieloma czytelnikami. Dzieje się tak, ponieważ nie wymieniłeś zapytania (db.users) z pierwszej pętli. Aby rozwiązać ten problem, możesz wyliczyć zapytanie w następujący sposób:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
A jeśli korzystasz z powyższej konfiguracji, nie musisz próbować dopasowywać identyfikatorów, po prostu uzyskaj listę znajomych (pole puste, jeśli nowe) od użytkownika za pomocą właściwości nawigacji znajomych. (wirtualny, leniwy ładowany), wykonaj:
user.Buddies
Jak widać, tak naprawdę nie potrzebujesz 'Model.buddy' (ponieważ zawiera tylko mapowanie id). Framework Entity zajmie się linkowaniem. Jeśli jednak nie zawsze uwzględniasz znajomych w zapytaniu użytkownika, możesz chcieć mieć tabelę. Który byłby zapytany przez LINQ w następujący sposób:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff