Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso esprimere una relazione ha molti tramite in Entity Framework 5?

Hai un tipo di dati che stai chiamando nomi separati. Questo è un po' confuso. Tuttavia, per farlo funzionare con il codice, hai bisogno della seguente configurazione fluente nella tua classe DbContext personalizzata:

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");
       });
}

Questo presupponendo che la tua classe utente assomigli a questa:

[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 utilizzi il metodo sopra, ogni oggetto utente che hai avrà una proprietà di navigazione su di esso chiamato Buddies. Quando esegui una query per gli utenti, vorrai caricare gli utenti desiderosi di caricare , fai:

context.users.Include("Buddies")

Inoltre, per affrontare il tuo problema con più lettori. È perché non hai enumerato la query (db.users) dal tuo primo ciclo. Per affrontarlo puoi enumerare la query in questo modo:

var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....

E se utilizzi la configurazione di cui sopra, non è necessario cercare di abbinare gli ID, acquisisci semplicemente l'elenco (campo nullo se nuovo) di amici dall'utente che utilizza la proprietà di navigazione degli amici (virtuale, caricato pigro), fare:

user.Buddies

Come puoi vedere, non hai davvero bisogno di un "Model.buddy" (poiché contiene solo una mappatura id) Il framework Entity si occuperà del collegamento. Tuttavia, se non includi sempre i Buddies nella tua query utente, potresti volere la tabella. Che verrebbe interrogato con LINQ nel modo seguente:

var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies 
//do stuff