10

Projemde bir Kullanıcı modelim ve bir Olay modelim var. Etkinlik, bir içerik oluşturucuya (Kullanıcı) sahiptir ve katılımcıya (Kullanıcılar) sahiptir; böylece Etkinlik, Kullanıcı ile bire çok ilişki ve aynı tabloya çoktan çoğa ilişkisi vardır.Varlık Çerçeve Kodu İlk: Bire Çok ve Çoktan Birden Çok İlişkisi aynı tabloya

: Ben göç birçok ilişki birçok oluşturmaz Çok-çok ilişki eklendiğinde Sonra

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

:

böyle ilk bire çok ilişki vardı

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

Bire çok ilişkiyi kaldırırsam, geçiş çoktan çoğa ilişkisi başarıyla oluşturur.

Bunu yalnızca veri ek açıklamalarıyla yapmanın bir yolu var mı?

+0

Doğru @slauma konum ingilizcem mazur benim anadilim değil, sadece benim en iyisini yapmaya çalışıyorum. – Escobar5

+0

Düzenledim, umarım daha net olur – Escobar5

+0

Bir dil meselesi demek istemedim, ancak içerik (herhangi bir hata mesajı veya istisnası vb. Varsa veya sonuç beklediğiniz gibi değilse). Neyse, nevermind, sorun zaten çözülmüş gibi görünüyor :) – Slauma

cevap

15

EF, User.Events'un eşlenmesi gereken yeri bilmemektedir. Event.CreatedBy olabilir veya Event.Users olabilir. Her ikisi de geçerli bir modelle sonuçlanır. Kod İlk Yaklaşımı ile

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

Mükemmel! buydu – Escobar5

8

, hep otomatik olarak bazı dönüşümleri kullanıyor Hangi DataAnnotations kullanmak yerine akıcı API kullanmak için tavsiye ediyorum: Sen EF Eğer [InverseProperty] niteliğini uygulayarak istediğini küçük bir ipucu vermek zorundadır.

Bu şekilde, tam olarak hangi yapılandırmayı yaptığınızı öğreneceksiniz. Yerinde olsaydım

, burada ben kullanmak olacaktınız:

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. 
    } 
} 
İlgili konular