U hebt één gegevenstype dat u afzonderlijke namen noemt. Dat is een beetje verwarrend. Om dit echter eerst met code te laten werken, hebt u alleen de volgende vloeiende configuratie in uw Custom DbContext-klasse nodig:
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");
});
}
Dit ervan uitgaande dat uw gebruikersklasse er als volgt uitziet:
[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; }
}
Als u de bovenstaande methode gebruikt, heeft elk gebruikersobject dat u heeft een navigatie-eigenschap erop genaamd Buddies. Wanneer u naar gebruikers zoekt, moet u buddy-gebruikers graag laden , doe:
context.users.Include("Buddies")
Verder, om uw probleem met meerdere lezers aan te pakken. Het is omdat u de zoekopdracht niet opsomt (db.users) uit uw eerste lus. Om dat aan te pakken kun je de zoekopdracht als volgt opsommen:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
En als u de bovenstaande configuratie gebruikt, hoeft u niet te proberen id's te matchen. U verkrijgt gewoon de lijst (null-veld indien nieuw) met vrienden van de gebruiker met behulp van de navigatie-eigenschap van buddies (virtueel, lui geladen), doe:
user.Buddies
Zoals je kunt zien, heb je niet echt een 'Model.buddy' nodig (omdat het alleen een id-toewijzing bevat). Entity-framework zorgt voor de koppeling. Als u de Buddies echter niet altijd in uw gebruikersquery opneemt, wilt u misschien de tabel. Die op de volgende manier met LINQ zou worden opgevraagd:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff