Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wyrazić relację ma wiele przez wiele w Entity Framework 5?

Masz jeden typ danych, który nazywasz osobnymi nazwami. To trochę mylące. Jednak aby to zadziałało najpierw z kodem, potrzebujesz tylko następującej konfiguracji płynnej w Twojej klasie 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");
       });
}

Zakładając, że twoja klasa użytkownika wygląda tak:

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

Jeśli użyjesz powyższej metody, każdy obiekt użytkownika, który posiadasz, będzie miał właściwość nawigacyjną o nazwie Buddies. Pytając o użytkowników, będziesz chciał załadować znajomych znajomych , zrób:

context.users.Include("Buddies")

Ponadto, aby rozwiązać Twój problem z wieloma czytelnikami. Dzieje się tak, ponieważ nie wymieniłeś zapytania (db.users) z pierwszej pętli. Aby rozwiązać ten problem, możesz wyliczyć zapytanie w następujący sposób:

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

A jeśli korzystasz z powyższej konfiguracji, nie musisz próbować dopasowywać identyfikatorów, po prostu uzyskaj listę znajomych (pole puste, jeśli nowe) od użytkownika za pomocą właściwości nawigacji znajomych. (wirtualny, leniwy ładowany), wykonaj:

user.Buddies

Jak widać, tak naprawdę nie potrzebujesz 'Model.buddy' (ponieważ zawiera tylko mapowanie id). Framework Entity zajmie się linkowaniem. Jeśli jednak nie zawsze uwzględniasz znajomych w zapytaniu użytkownika, możesz chcieć mieć tabelę. Który byłby zapytany przez LINQ w następujący sposób:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 193:%1 nie jest poprawnym błędem aplikacji Win32 z nową aplikacją Rails

  2. Używanie pola DATE jako klucza podstawowego wymiaru daty w MySQL

  3. MySQL Row 30153 został wycięty przez błąd GROUP_CONCAT()

  4. Wstaw wiele elementów do jednego identyfikatora MySQL z pola wyboru wejściowego formularza PHP

  5. Dynamiczny pivot MySQL