2011-02-26 15 views
39

Ben Eşlemeleri'ni ama nafile ekleyerek çalıştı tümKendine referans birçok çoğa özyinelemeli ilişki kodunun ilk Varlık Framework

class Member 
{ 
    public virtual IList<Member> Friends { get; set; } 
    [Key] 
    public int MemberId { get; set; } 
    public string Name{ get; set; } 
} 

de bu işi yapmak için görünmüyor olabilir. CTP5 ile bunu yapmanın bir yolu var mı?

+0

Bunun için öncelikle kod yazmayı düşünmüyorum ama [bu gönderiyi kontrol et] (http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/05198b97-f178-49ba-91da-7a2516a9ad8d) dışarı. –

cevap

56

, Kod İlk birçok biri olarak tek yönlü ilişkileri alacaktır.

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany(); 
} 

Not: Bu nedenle Kod Önce birçok öz referans dernek için birçok olmasını istediğiniz bildirmek için akıcı API kullanmak gerekir katılmak özelleştirmek izin vermez CTP5 bilinen bir hata var Bu senaryoda tablo sütun adları.

+2

Morteza, seni burada ve blog'unda takip ediyorum. Bu kusursuz çalışıyor! sonuçta ortaya çıkan tablo tuhaf olan ancak RTM'de sabitlenecek olan [ÜyeMembers] olarak adlandırılır. Teşekkürler dostum! – Korayem

+0

merhaba, birden fazla öz referanslamayı nasıl kullanabileceğimizi bilmem gerek. örneğin aynı örnek kod üzerinde; genel sanal IList Arkadaşlar {get; set; genel sanal IList Ebeveynler {get; set; } –

+0

Bu mükemmel çalıştı, teşekkürler. Herhangi birinin, oluşturacağı çoktan çoğa tablosunun adını belirtmek olduğunu biliyor musunuz? MemberMembers şey tamam çalışıyor, ama çirkin görünüyor. –

0

Örneğiniz çoktan çoğa ilişkisi değil, yinelemeli bir ilişkidir.

Nasıl düzeltileceğinden emin değilim. Ancak, kodunuzdaki sorun, aynı satırda aynı ada sahip iki alanın alacağınızdır. Üye kimliğinin kimliği ve üyesi kimliği için MemberId.

Düzenleme

böyle yapıyor deneyin: Geleneksel olarak

class Member 
    { 
     [Key] 
     public int MemberId { get; set; } 
     public string Name { get; set; } 

     public virtual IList<FriendRelationship> Friends { get; set; } 

    } 

    class FriendRelationship 
    { 
     [Key] 
     public int RelationshipId { get; set; } 

     public Member Friend { get; set; } 
    } 
+0

Benim için çoktan çoğa olabilir çünkü [LeftMemberId] ve [RightMemberId] ile bir tablo [Friends] tanıtılarak çözülebilir. Doğru adlandırma ne olursa olsun, bunu işe alamıyorum :( – Korayem

+0

Thanx dostum, çözümünüzü denemek için bir değişiklik yapmadım, ancak bu, el ile yaptığım ilk çözümümdür. RTM için bekleyemiyorum :) – Korayem

2

Bunu, Model-First kullanarak EF 4 CTP5'te çalışmak için alabilirsiniz, ancak CTP5 Kod İlkinde, bu tür senaryolar için Kod İlkesini kullanacak özdeğerli ve çok biçimlili sorgu yapılandırmalarına sahip çok fazla hata var. Morteza Manavi (diğer cevaplara bakın) blogunda birkaçını belgeledi.

+0

Doğru. Hope RTM, taleplerimizi yerine getirir. Kod ilk önce harika! – Korayem

16

Sana bu kodla birçok tablo adı için pek çok etkileyebilir doğru isem: Bu yardımcı olur

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Member>().HasMany(m => m.Friends).WithMany().Map(m => 
     { 
      m.MapLeftKey("MemberId"); 
      m.MapRightKey("FriendId"); 
      m.ToTable("MembersFriends"); 
     } 
    ); 
} 

umudu.