10

Mam model użytkownika i model zdarzenia w moim projekcie. Wydarzenie ma twórcę (użytkownika) i ma uczestnika (użytkowników), dzięki czemu zdarzenie ma relację jeden do wielu z użytkownikiem, a także relację wiele do wielu do tej samej tabeli.Kod jednostki Entity Najpierw: relacje jeden do wielu i wiele do wielu do tej samej tabeli

miałem pierwszy relacji jeden-do-wielu tak:

Public class Event 
{ 
     ... 
     public int CreatedById { get; set; } 
     public virtual User CreatedBy { get; set; } 
     ... 
} 

Wtedy kiedy dodał wiele do wielu relacji migracja nie generuje wiele do wielu relacji:

Public class User 
{ 
     ... 
     public virtual ICollection<Event> Events { get; set; } 
     ... 
} 

Public class Event 
{ 
     ... 
     public int CreatedById { get; set; } 
     public virtual User CreatedBy { get; set; } 
     public virtual ICollection<User> Users { get; set; } 
     ... 
} 

Jeśli usuwam relację jeden-do-wielu, migracja pomyślnie generuje relację wiele-do-wielu.

Czy można to zrobić tylko z adnotacjami danych?

+0

Masz rację @slauma, przepraszam mój angielski nie jest mój język ojczysty, ja po prostu staram się robić jak najlepiej. – Escobar5

+0

Ja to zredagowałem, mam nadzieję, że jest bardziej zrozumiały – Escobar5

+0

Nie miałem na myśli języka, ale treści (jeśli są jakieś komunikaty o błędach lub wyjątki, itp. Lub jeśli wynik nie jest tym, czego się spodziewałeś, itp.). W każdym razie, nieważne, problem wydaje się być już rozwiązany :) – Slauma

Odpowiedz

15

EF nie wie, gdzie musi być mapowany User.Events. Może to być Event.CreatedBy lub może być Event.Users. Oba skutkują prawidłowym modelem. Musisz dać EF trochę wskazówkę co chcesz stosując atrybut [InverseProperty]:

public class User 
{ 
    ... 
    [InverseProperty("Users")] 
    public virtual ICollection<Event> Events { get; set; } 
    ... 
} 
+0

Idealnie! to było to – Escobar5

8

Z Kod pierwszym podejściu, chciałbym zawsze zaleca się stosowanie biegle API zamiast używać DataAnnotations, który wykorzystuje pewne konwersje automatycznie.

W ten sposób dowiesz się, jaką dokładnie konfigurację wykonałeś.

Gdybym był tobą, o to co chciałbym używać:

public class EventMap : EntityTypeConfiguration<Event> 
{ 
    public EventMap() 
    { 
     this.HasRequired(m => m.CreatedBy) // envent must have a creator 
      .WithMany() // a user can have 0,1 or more events created by him 
      .HasForeignKey(m => m.CreatedById) // specify property to be used as FK 
      .WillCascadeOnDelete(true); // delete all events created by user if that specific user is deleted 

     this.HasMany(m=>m.Users) // an event can have 0,1 or more participants 
      .WithMany(m=>m.Events) // a user can be a participant in 0,1 or more events     
      .Map(m => m.MapLeftKey("EventId").MapRightKey("UserId")); // this will generate intermediate table to hold participant information - dbo.EventUser with EventId & UserId 
      // Cascade Delete is always true for Many to Many mapping. however, it doesn't delete entry in other table, it deletes entry in Joined Table only. 
    } 
} 
Powiązane problemy