2012-03-21 4 views
11

मैं इकाई ढांचे का उपयोग कर रहा हूं और कई से अधिक रिश्तों को मॉडलिंग कर रहा हूं।क्या इकाई फ्रेमवर्क का उपयोग करके कई से अधिक तालिकाओं को सीधे संदर्भित करना संभव है, कोड पहले

मैं धाराप्रवाह एपीआई का उपयोग कर दो संस्थाओं के बीच संबंध बनाया है (के उपयोगकर्ताओं और समूहों मान लीजिए):

this.HasMany(t => t.Users) 
.WithMany(t => t.Groups) 
.Map(
m => 
{ 
    m.ToTable("GroupMembers"); 
    m.MapLeftKey("Group_Id"); 
    m.MapRightKey("User_Id"); 
}); 

यह अच्छा काम करता है, लेकिन मैं चाहता हूँ भी GroupMembers तालिका को देख करने में सक्षम हो सीधे। ऐसा करने के लिए, मैं की तरह कुछ है:

[Table("GroupMembers")] 
public class GroupMember 
{ 
    #region Properties 

    /// <summary> 
    /// Gets or sets the group. 
    /// </summary> 
    public virtual Group Group { get; set; } 

    /// <summary> 
    /// Gets or sets the Id of rht group. 
    /// </summary> 
    [Key] 
    [Column("Group_Id", Order = 1)] 
    public int GroupId { get; set; } 

    /// <summary> 
    /// Gets or sets the user. 
    /// </summary> 
    public virtual User User { get; set; } 

    /// <summary> 
    /// Gets or sets the Id of the user. 
    /// </summary> 
    [Key] 
    [Column("User_Id", Order = 2)] 
    public int UserId { get; set; } 

    #endregion 
}  

हालांकि, मैं DbContext के आरंभ के दौरान निम्न त्रुटि प्राप्त होगा:

स्कीमा निर्दिष्ट मान्य नहीं है। त्रुटियां: (381,6): त्रुटि 0019: स्कीमा 'डीबीओ' और तालिका 'ग्रुपमेम्बर' के साथ एंटिटीसेट 'ग्रुप यूज़र' पहले ही परिभाषित किया गया था। प्रत्येक EntitySet को एक अद्वितीय स्कीमा और तालिका का संदर्भ लेना चाहिए।

मेरा मानना ​​है कि इस वजह से इकाई की रूपरेखा एहसास नहीं है कि GroupMembers तालिका धाराप्रवाह एपीआई और GroupMembers संस्थाओं तालिका में निर्दिष्ट वास्तव में एक ही में से एक हैं। दूसरे शब्दों में, यदि मैं धाराप्रवाह एपीआई कोड हटा देता हूं जो कई से अधिक रिश्ते का वर्णन कर रहा है, तो मैं डीबीकॉन्टेक्स्ट को प्रारंभ करने में सफलतापूर्वक सक्षम हूं।

क्या मेरे पास कई से अधिक टेबल हो सकती हैं जिन्हें मैं सीधे संदर्भ भी दे सकता हूं?

उत्तर

11

नहीं, आप नहीं कर सकते। आप एक अलग इकाई के माध्यम से तालिका में शामिल होने के लिए उपयोग करना चाहते हैं आप GroupMember का उल्लेख करने के User और Group में नेविगेशन गुण अपने कई-से-अनेक संबंध से दो एक-से-कई रिश्तों को बदलने और परिवर्तन करना होगा:

public class Group 
{ 
    public int GroupId { get; set; } 
    public virtual ICollection<GroupMember> Members { get; set; } 
} 

public class User 
{ 
    public int UserId { get; set; } 
    public virtual ICollection<GroupMember> Members { get; set; } 
} 

modelBuilder.Entity<Group>() 
    .HasMany(g => g.Members) 
    .WithRequired(gm => gm.Group); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.Members) 
    .WithRequired(gm => gm.User); 

आप यह GroupMember इकाई क्यों चाहते हैं? इसमें कोई व्यावसायिक अर्थ नहीं है और इसमें केवल संदर्भ और कुंजी हैं। आम तौर पर आप LINQ क्वेरीज़ लिखकर और Group और User डीबीसेट्स/इकाइयों और उनके नेविगेशन गुणों का उपयोग करके जॉइन टेबल की किसी भी सामग्री को प्राप्त और संशोधित कर सकते हैं।

+1

धन्यवाद। उपयोगकर्ता और समूह दोनों आधार तालिका, प्रिंसिपल से प्राप्त होते हैं, और वहां एक और तालिका है, अनुमतियां, जिसमें उपयोगकर्ता और समूहों दोनों के लिए अनुमतियां होती हैं। इसके लिए LINQ क्वेरी कुछ ऐसा दिखता है: संदर्भ में पी से ।अनुमतियां में शामिल होने p.PrincipalId पर context.GroupMembers में मीटर m.GroupId जहां m.UserId.Equals (principalId) चयन पी मैं काफी यकीन है कि कैसे सीधे GroupMembers तालिका के संदर्भ के बिना कि क्वेरी प्रदर्शन करने के लिए नहीं कर रहा हूँ बराबर होती है। – Eric

+0

@Eric: मैं मॉडल के बारे में अधिक जानकारी के साथ इस के लिए एक अलग सवाल पैदा करने के लिए सलाह देते हैं। – Slauma

+0

@Eric मैं बिल्कुल एक ही समस्या है, यह विसंगत लगता है कि धाराप्रवाह एपीआई केवल पहले से ही मौजूदा – Lu4

0

हाँ, आप कर सकते हैं! this देखें। साथ ही, समूहसमूह इकाई और आईडीबीसेट संग्रह को हटा दें।

+0

यह सवाल काफी विपरीत उत्तर नहीं मिलता है। इस तरह के बिना * तालिका के लिए उपयोग यह स्वचालित बनाने के लिए * के बारे में है, सवाल यह है कि तालिका का उपयोग करने के बारे में था। –

0

हम इस दृष्टिकोण को बनाकर इस बारे में मिल गए हैं जिसका उपयोग केवल रिश्ते को परिभाषित करने के लिए किया जाता है। हमारे पास लुकअप टेबल में अन्य फ़ील्ड थे जिन्हें हमें एक्सेस करने की आवश्यकता थी।

व्यू बस लुकअप टेबल से जुड़ने वाले फ़ील्ड का चयन करता है।

1

हाँ आप कर सकते हैं ... यदि आप एक और संदर्भ का उपयोग करते हैं। यदि आप एक ही संदर्भ में एक ही तालिका में एक से अधिक इकाई को मैप करने का प्रयास करते हैं तो आपको त्रुटि मिल जाएगी। लेकिन यदि आप अलग-अलग संदर्भों में दो मैपिंग डालते हैं तो कोई समस्या नहीं होगी। इस तरह आप एक मैपिंग प्राप्त कर सकते हैं जो जुड़ने वाली तालिका के साथ कई रिश्ते का वर्णन करता है जैसे कि इसमें केवल विदेशी कुंजी हैं ... और यदि आप वास्तविक संदर्भ तालिका का पर्दाफाश करने के लिए अपने संदर्भ के साथ एक और मानचित्रण कर सकते हैं, आप रिश्ते के किसी भी गुण पर जाना चाहते हैं।

संबंधित मुद्दे