2013-03-01 30 views
23

'daki fazla alanla birçok eşleştirmeye çok fazla ilişkim var ve Code First Fluent API'yi kullanarak çift tabloya fazladan veri depolamak istiyorum.Fluent API

Bu nasıl elde edilebilir?

Benim modelim:

Bir kullanıcı (opsiyonel) 1 ya da daha fazla rozetleri olabilir

, rozet, bir veya daha fazla kullanıcı (isteğe bağlı) ait olabilir. Bu ilişkinin saklanması için fazladan bir alan (B adı verilen) depolamak istiyorum. tablo aşağıdaki alanlarla UserBadges adlı olmalıdır: UserId, BadgeId, B

(ı StackOverflow'daki here bu erken gördük, ama ben modeli oldukça karmaşıktır ve bir cevap doğru henüz verilmiş)

cevap

43

Bunu doğrudan çoktan çoğa eşleyemezsiniz. Eğer birleşim tablosuna ek alan ekleyin ve bunun yerine bir varlık için kavşak tablo teşvik etmek ve iki bire çok ilişki kullanmaya gerek uygulamada bu alanı erişmek istiyorsanız:

public class Badge { 
    ... 
    public virtual ICollection<UserBadge> UserBadges { get; set; } 
} 

public class User { 
    ... 
    public virtual ICollection<UserBadge> UserBadges { get; set; } 
} 

public class UserBadge { 
    public int UserId { get; set; } 
    public int BadgeId { get; set; } 
    public string B { get; set; } 
    public virtual Badge Badge { get; set; } 
    public virtual User User { get; set; } 
} 

varsayılan kuralları gerektiği Eşlemeyi, Fluent-API veya veri ek açıklamalarında yapılması gereken UserBadge tablosunun anahtarı hariç doğru olarak tanımlayın.

modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId }); 
+1

Thx, ancak bu işe yararsa şüpheliyim, çünkü UserId ve BadgeId bileşenlerini PK olarak tanımlarsınız. İçinde aynı UserId ve BadgeId ile 2 kayıt olması mümkün olmalıdır, B değeri onun farklı değerini yapar (başka bir tabloya FK). –

+0

@PatrickPeters: Böyle bir durumda, PK'yi farklı bir şekilde tanımlamanız gerekir, ancak cevabın noktası hala aynıdır - bağlantı tablosunu varlık olarak göstermeniz gerekir. –

+0

Evet Ladislav, sen haklısın. Bunu cevabınıza göre düzeltdim ve işe yarıyor. –

İlgili konular