2013-09-22 4 views
11

मैं एंटिटी फ्रेमवर्क 5 में निम्नलिखित संबंधों को कैसे मैप करूं?इकाई फ्रेमवर्क 5 कोड प्रथम स्व-संदर्भ संबंध

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Item>() 
       .HasOptional(i => i.ParentItem) 
       .WithMany(i => i.ChildItems) 
       .HasForeignKey(i => i.ParentItemId); 
} 

और इस:

public class Item { 
    public int Id { get; set; } 
    public int? ParentItemId { get; set; } 
    public string Value { get; set; } 

    public Item ParentItem { get; set; } 
    public List<Item> ChildItems { get; set; } 
} 

मैं इस की कोशिश की है

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Item>() 
       .HasMany(i => i.ChildItems) 
       .WithOptional(i => i.ParentItem) 
       .HasForeignKey(i => i.ParentItemId); 
} 

जो ऐसा गलती से हुआ दोनों परिणाम: आश्रित में सभी संपत्तियों की

प्रकार एक रेफरेंशियल बाधा की भूमिका प्रिय में संबंधित संपत्ति प्रकारों के समान ही होनी चाहिए मुख्य भूमिका।

अगर मैं डेटाबेस पहले मानचित्रण के साथ शुरू करते हैं, यहाँ उत्पन्न इकाई दिखता है की तरह है:

public partial class Item 
{ 
    public Item() 
    { 
     this.ChildItems = new HashSet<Item>(); 
    } 

    public int Id { get; set; } 
    public Nullable<int> ParentItemId { get; set; } 
    public string Value { get; set; } 

    public virtual ICollection<Item> ChildItems { get; set; } 
    public virtual Item ParentItem { get; set; } 
} 

मैं जानता हूँ कि अगर मैं के साथ शुरू इस काम करेंगे db-पहले, मैं सिर्फ पता है कि कैसे की जरूरत है कोड-पहले में रिश्ते को परिभाषित करें।

+0

कुंजी संपत्ति है 'Id'? या क्या आपके पास एक प्रमुख मैपिंग (फ्लुएंट एपीआई के साथ?) है, उदाहरण के लिए 'वैल्यू'? – Slauma

+0

आईडी आइटम की प्राथमिक कुंजी संपत्ति है। – user326502

+0

"* निर्भर भूमिका में सभी गुणों के प्रकार *" का अर्थ है एफके संपत्ति के प्रकार जो 'ParentItemId' है और' int 'टाइप है। "* प्रिंसिपल रोल * में संबंधित संपत्ति प्रकार * का अर्थ है पीके संपत्ति के प्रकार जो 'आईडी' है और इसमें 'int' टाइप है। वे वही हैं (शून्यता कोई फर्क नहीं पड़ता)। हालांकि, अपवाद कहता है, वे नहीं हैं। अपवाद तब होगा जब आपने उदाहरण के लिए पीके के लिए 'लंबा' (या कोई अन्य प्रकार) और एफके के लिए 'int' 'था। बल्कि अजीब ... – Slauma

उत्तर

2

अपवाद का मतलब है निम्नलिखित:

  • FK संपत्ति जो ParentItemId है और अपने मॉडल के int? टाइप है के प्रकार हैं "निर्भर भूमिका में सभी गुण के प्रकार"
  • "प्रिंसिपल रोल में संबंधित संपत्ति प्रकार "पीके प्रॉपर्टी के प्रकार हैं जो Id है और आपके मॉडल में आपके मॉडल
में टाइप करें

वे वही हैं (शून्यता कोई फर्क नहीं पड़ता)। हालांकि, अपवाद कहता है, वे नहीं हैं।

अपवाद सामान्य रूप से तब होता है जब प्रकार मेल नहीं खाते हैं, उदाहरण के लिए यदि आपके पास पीके के लिए long (या कोई अन्य प्रकार) है और FK के लिए int? है।

0

मानचित्र का उपयोग करने का प्रयास करें HasForeignKey का उपयोग करने के बजाय इसे करने का कोई तरीका। जैसा

modelBuilder.Entity<Course>() 
    .HasRequired(c => c.Department) 
    .WithMany(t => t.Courses) 
    .Map(m => m.MapKey("ChangedDepartmentID")); 
+0

उत्तर देने के लिए समय लेने के लिए धन्यवाद। इस तरह से कोशिश करते समय, मुझे निम्न त्रुटि मिलती है: एक प्रकार में प्रत्येक संपत्ति का नाम अद्वितीय होना चाहिए। संपत्ति का नाम 'ParentItemId' पहले ही परिभाषित किया गया था। – user326502

+0

उपरोक्त कई से एक मैपिंग के ठीक पहले ParentItemId प्रॉपर्टी पर अनदेखा करें .. मॉडलबिल्डर। एंटीटी ()। अनदेखा करें (यह => it.ParentItemId); –

7

कोड में पहली बार इस तरह अपने इकाई वर्ग बदलने के लिए:

public class Item 
    { 
     public Item() 
     { 
      this.ChildItems = new HashSet<Item>(); 
     } 

     public int Id { get; set; } 
     public Nullable<int> ParentItemId { get; set; } 
     public string Value { get; set; } 

     public virtual Item ParentItem { get; set; } 
     public virtual ICollection<Item> ChildItems { get; set; } 
    } 

अपने प्रसंग फ़ाइल के लिए निम्न कोड लिखें:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Item>() 
        .HasOptional(i => i.ParentItem) 
        .WithMany(i => i.ChildItems) 
        .HasForeignKey(i => i.ParentItemId); 
    } 

सोचते हैं कि ऐसा काम करना चाहिए।

+0

उत्तर देने के लिए समय लेने के लिए धन्यवाद। इस तरह से प्रयास करते समय, मुझे अभी भी वही त्रुटि मिलती है: एक संदर्भित बाधा की निर्भर भूमिका में सभी गुणों के प्रकार प्रिंसिपल रोल में संबंधित संपत्ति प्रकारों के समान होना चाहिए। – user326502

3

यह क्यों इस्तेमाल नहीं:

public class Item 
    { 
     public Item() 
     { 
      ChildItems = new HashSet<Item>(); 
     } 

     public int Id { get; set; } 
     public int? ParentItemId { get; set; } 
     public string Value { get; set; } 

     public virtual Item ParentItem { get; set; } 
     public virtual ICollection<Item> ChildItems { get; set; } 
    } 

और अपने DataContex कक्षा में:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Item>() 
        .HasOptional(i => i.ParentItem) 
        .WithMany() 
        .HasForeignKey(i => i.ParentItemId); 
    } 

आशा यह काम।

इसके अलावा वहाँ एक अच्छा लेख यहाँ है: कैसे संहिता सबसे पहले में यह स्व संदर्भित इकाई कॉन्फ़िगर करने के लिए http://blogs.microsoft.co.il/gilf/2011/06/03/how-to-configure-a-self-referencing-entity-in-code-first/

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