Você tem um tipo de dados que está chamando de nomes separados. Isso é um pouco confuso. No entanto, para que isso funcione com o código primeiro, você só precisa da seguinte configuração fluente em sua classe DbContext personalizada:
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");
});
}
Isso assumindo que sua classe de usuário se parece com isso:
[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; }
}
Se você usar o método acima, cada objeto de usuário que tiver terá uma propriedade de navegação nele chamado Buddies. Ao consultar usuários, você desejará carregar ansiosos usuários amigos , Faz:
context.users.Include("Buddies")
Além disso, para resolver seu problema com vários leitores. É porque você não enumerou a consulta (db.users) do seu primeiro loop. Para resolver isso, você pode enumerar a consulta assim:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
E se você usar a configuração acima, você não precisa tentar combinar os id's, basta adquirir a lista (campo nulo se novo) de amigos do usuário usando a propriedade de navegação dos amigos (virtual, carregado com preguiça), faça:
user.Buddies
Como você pode ver, você realmente não precisa de um 'Model.buddy' (já que ele contém apenas um mapeamento de id) O framework de entidade cuidará da vinculação. No entanto, se você nem sempre inclui os amigos na consulta do usuário, talvez queira a tabela. Que seria consultado com LINQ da seguinte maneira:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff