Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment exprimer une relation multiple dans Entity Framework 5?

Vous avez un type de données que vous appelez des noms distincts. C'est un peu déroutant. Cependant, pour que cela fonctionne avec le code, vous avez d'abord besoin de la configuration fluide suivante dans votre classe DbContext personnalisée :

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

Ceci en supposant que votre classe d'utilisateurs ressemble à ceci :

[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 vous utilisez la méthode ci-dessus, chaque objet utilisateur que vous avez aura une propriété de navigation dessus appelé Buddies. Lorsque vous interrogez des utilisateurs, vous souhaiterez charger des utilisateurs amis impatients , faites :

context.users.Include("Buddies")

En outre, pour résoudre votre problème avec plusieurs lecteurs. C'est parce que vous n'avez pas énuméré la requête (db.users) de votre première boucle. Pour résoudre ce problème, vous pouvez énumérer la requête comme suit :

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

Et si vous utilisez la configuration ci-dessus, vous n'avez pas besoin d'essayer de faire correspondre les identifiants, vous acquérez simplement la liste (champ nul si nouveau) des amis de l'utilisateur en utilisant la propriété de navigation des amis (virtuel, chargement différé), faites :

user.Buddies

Comme vous pouvez le voir, vous n'avez pas vraiment besoin d'un 'Model.buddy' (puisqu'il ne contient qu'un mappage d'id) Entity Framework se chargera de la liaison. Cependant, si vous n'incluez pas toujours les amis dans votre requête d'utilisateur, vous souhaiterez peut-être utiliser le tableau. Qui serait interrogé avec LINQ de la manière suivante :

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