sql >> Database >  >> RDS >> Mysql

Hoe druk ik a heeft veel door middel van relatie in Entity Framework 5?

U hebt één gegevenstype dat u afzonderlijke namen noemt. Dat is een beetje verwarrend. Om dit echter eerst met code te laten werken, hebt u alleen de volgende vloeiende configuratie in uw Custom DbContext-klasse nodig:

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

Dit ervan uitgaande dat uw gebruikersklasse er als volgt uitziet:

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

Als u de bovenstaande methode gebruikt, heeft elk gebruikersobject dat u heeft een navigatie-eigenschap erop genaamd Buddies. Wanneer u naar gebruikers zoekt, moet u buddy-gebruikers graag laden , doe:

context.users.Include("Buddies")

Verder, om uw probleem met meerdere lezers aan te pakken. Het is omdat u de zoekopdracht niet opsomt (db.users) uit uw eerste lus. Om dat aan te pakken kun je de zoekopdracht als volgt opsommen:

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

En als u de bovenstaande configuratie gebruikt, hoeft u niet te proberen id's te matchen. U verkrijgt gewoon de lijst (null-veld indien nieuw) met vrienden van de gebruiker met behulp van de navigatie-eigenschap van buddies (virtueel, lui geladen), doe:

user.Buddies

Zoals je kunt zien, heb je niet echt een 'Model.buddy' nodig (omdat het alleen een id-toewijzing bevat). Entity-framework zorgt voor de koppeling. Als u de Buddies echter niet altijd in uw gebruikersquery opneemt, wilt u misschien de tabel. Die op de volgende manier met LINQ zou worden opgevraagd:

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



  1. Een overzicht van PostgreSQL-querycaching en taakverdeling

  2. MySQL 5.6 DATETIME accepteert geen milliseconden/microseconden

  3. Hoe de datum te selecteren in de datetime-kolom?

  4. Full-Text Search implementeren in SQL Server 2016 voor geavanceerde gebruikers