sql >> Databáze >  >> RDS >> Mysql

Jak v Entity Framework 5 vyjádřím vztah typu has many?

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



  1. Spring-boot webová aplikace po chvíli ztrácí schopnost připojit se k MySQL / RDS

  2. MySQL zkrátí text se třemi tečkami

  3. ClusterControl:Úvod do nového monitoru dotazů

  4. Najít rodiče rekurzivně pomocí Query