Máte jeden datový typ, který nazýváte samostatnými názvy. To je trochu matoucí. Aby to však fungovalo nejprve s kódem, potřebujete pouze následující plynulou konfiguraci ve vaší třídě 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");
});
}
To za předpokladu, že vaše třída uživatelů vypadá takto:
[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; }
}
Pokud použijete výše uvedenou metodu, každý uživatelský objekt, který máte, bude mít vlastnost navigace na to s názvem Kamarádi. Při dotazování na uživatele budete chtít netrpělivě načíst kamarádské uživatele , proveďte:
context.users.Include("Buddies")
Dále k řešení vašeho problému s více čtenáři. Je to proto, že jste nevyjmenovali dotaz (db.users) z vaší první smyčky. Chcete-li to vyřešit, můžete dotaz vyčíslit takto:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
A pokud použijete výše uvedenou konfiguraci, nemusíte se snažit a shodovat se s ID, jednoduše získáte seznam kamarádů (pokud je nové pole prázdné) od uživatele pomocí vlastnosti navigace kamarádi. (virtuální, líné načteno), proveďte:
user.Buddies
Jak vidíte, ve skutečnosti nepotřebujete 'Model.buddy' (protože obsahuje pouze mapování id). O propojení se postará Entity framework. Pokud však do svého uživatelského dotazu vždy nezahrnujete kamarády, možná budete chtít tabulku. Který by byl dotazován pomocí LINQ následujícím způsobem:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff