sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo expreso una relación tiene muchos a través de Entity Framework 5?

Tiene un tipo de datos al que está llamando nombres separados. Eso es un poco confuso. Sin embargo, para que esto funcione primero con el código, solo necesita la siguiente configuración fluida en su clase 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");
       });
}

Esto suponiendo que su clase de usuario se vea así:

[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; }
}

Si usa el método anterior, cada objeto de usuario que tenga tendrá una propiedad de navegación en él llamado Buddies. Al consultar usuarios, querrá cargar usuarios amigos , hacer:

context.users.Include("Buddies")

Además, para abordar su problema con múltiples lectores. Es porque no ha enumerado la consulta (db.users) desde su primer ciclo. Para abordar eso, puede enumerar la consulta así:

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

Y si usa la configuración anterior, no es necesario que intente hacer coincidir las identificaciones, simplemente adquiera la lista (campo nulo si es nuevo) de amigos del usuario que usa la propiedad de navegación de amigos. (virtual, carga lenta), hacer:

user.Buddies

Como puede ver, realmente no necesita un 'Model.buddy' (ya que solo contiene una asignación de identificación) El marco de la entidad se encargará de la vinculación. Sin embargo, si no siempre incluye a los Buddies en su consulta de usuario, es posible que desee la tabla. Que se consultaría con LINQ de la siguiente forma:

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