Sie haben einen Datentyp, den Sie unterschiedliche Namen nennen. Das ist ein wenig verwirrend. Damit dies jedoch zuerst mit Code funktioniert, benötigen Sie nur die folgende fließende Konfiguration in Ihrer benutzerdefinierten DbContext-Klasse:
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");
});
}
Vorausgesetzt, Ihre Benutzerklasse sieht folgendermaßen aus:
[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; }
}
Wenn Sie die obige Methode verwenden, hat jedes Benutzerobjekt, das Sie haben, eine Navigationseigenschaft darauf namens Buddies. Wenn Sie nach Benutzern suchen, sollten Sie eifrig befreundete Benutzer laden , tun:
context.users.Include("Buddies")
Außerdem, um Ihr Problem mit mehreren Lesern anzusprechen. Das liegt daran, dass Sie die Abfrage nicht aufgezählt haben (db.users) aus Ihrer ersten Schleife. Um dies zu adressieren, können Sie die Abfrage wie folgt aufzählen:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
Und wenn Sie die obige Konfiguration verwenden, müssen Sie nicht versuchen, IDs abzugleichen. Sie erhalten einfach die Liste (Nullfeld, falls neu) der Freunde vom Benutzer, der die Navigationseigenschaft der Freunde verwendet (virtuell, faul geladen), tun:
user.Buddies
Wie Sie sehen können, brauchen Sie nicht wirklich einen 'Model.buddy' (da er nur eine ID-Zuordnung enthält). Das Entity-Framework kümmert sich um die Verknüpfung. Wenn Sie die Buddies jedoch nicht immer in Ihre Benutzerabfrage einbeziehen, möchten Sie möglicherweise die Tabelle. Welches würde mit LINQ auf folgende Weise abgefragt werden:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff