2012-10-20 10 views
6

मुझे यहां बहुत सारे प्रश्न मिल गए हैं, लेकिन उनमें से कोई भी मेरी समस्या से मेरी सहायता नहीं करता है। Fluent api & गुणों की मदद नहीं की। डेटाबेस बनाया गया था, लेकिन जब कोई ऑब्जेक्ट जोड़ रहा था, तो यह क्रैश हो गया। मैं एक कक्षा चाहता हूं जिसमें स्वयं का संग्रह हो। यहाँ है कोड मैं: डेटाबेस मेंकोड प्रथम - कई संबंधों में से एक को संदर्भित करना

[Table("UObjects")] 
public class UObject 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Browsable(false)] 
    public long ID { get; set; } 
    public string Name { get; set; } 
    [Browsable(false)] 
    public long? ParentID { get; set; } 

    public virtual UObject UParent { get; set; } 
    [Browsable(false)] 
    public virtual ICollection<UObject> UObjects { get; set; } 
} 


public class MyContext : DbContext 
{ 
    public DbSet<UObject> UObjects { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // This fluent API didn't help 
     //modelBuilder.Entity<UObject>() 
     //  .HasOptional(u => u.UParent) 
     //  .WithMany(u => u.UObjects) 
     //  .HasForeignKey(u => u.ParentID); 

     //modelBuilder.Entity<UObject>() 
     //  .HasOptional(u => u.UParent) 
     //  .WithMany(u => u.UObjects) 
     //  .Map(c => 
     //  { 
     //   c.MapKey("ParentID"); 
     //   c.ToTable("UObjects"); 
     //  }); 
    } 
} 

रिकॉर्ड्स इस तरह हैं:

ID | Name  | ParentID 
------------------------------------ 
1 | First  | 0 
2 | SubFirst | 1 
3 | SubSecond | 1 
4 | SubThird | 2 
5 | SubFourth | 2 

तो मेरी वस्तु संस्थाओं लोड करने के बाद कैसी दिखनी चाहिए, बगल में है:

- First 
     - SubFirst 
     - SubThird 
     - SubFourth 
     - SubSecond 

लेकिन हर वस्तु एक खाली संग्रह है। इसे ठीक से काम करने के लिए मुझे क्या करना चाहिए?

+0

यह जांचें http://stackoverflow.com/questions/10421351/many-to-many-relationship-between-entities-of-same-type-in-mvc3/10422172#10422172 – Shyju

+0

इसे पहले से ही आजमाया गया। इसने डेटाबेस बनाया लेकिन यह नई ऑब्जेक्ट जोड़ने और SaveChanges() – GaaRa

+5

"* यह क्रैश * * को कॉल करते समय क्रैश हो जाता है, वास्तव में एक अच्छी समस्या का विवरण नहीं है। 1) बिल्कुल अपवाद क्या है? 2) जब आप रिक्त संग्रह वाले इकाइयों को लोड करते हैं तो आप किस क्वेरी को चलाते थे? 3) आपके पास पहली डेटाबेस पंक्ति में '0' का 'पैरेंट आईडी' क्यों है? यह एक रेफरेंशियल बाधा का उल्लंघन करता है ('आईडी' 0 के साथ कोई पंक्ति नहीं है)। या क्या आपका मतलब 'नूल' है? – Slauma

उत्तर

-3
  1. ForeignKey गुण और के साथ अपने UParent संपत्ति डेकोरेट? के बाद से यह व्यर्थ हो सकता है

[ForeignKey("ParentID")] public virtual UObject? UParent { get; set; }

  1. डेटाबेस में: 'शून्य' पर सेट ParentId मूल्य अगर कोई माता पिता है।
+2

द? अमान्य है, चूंकि UObject एक वर्ग है, मान प्रकार नहीं है। –

5

आप केवल मैदान पर सही करने के बजाय इस तरह संपत्ति का नेवीगेशन पर स्वयं संदर्भ का उल्लेख करने की जरूरत है:

[ForeignKey("UParent")] // EF need for self reference 
public long? ParentID { get; set; } 

और निर्माता में इस तरह नेविगेशन गुण प्रारंभ:

public UObject()  
    { 
     // this is necessary otherwise EF will throw null object reference error. you could also put ?? operator check for more interactive solution. 
     UObjects = new List<UObject>(); 
    } 

और जैसा कि आप कर रहे थे, ओवरराइड करने की भी आवश्यकता है, लेकिन इस तरह:

protected override void OnModelCreating(DbModelBuilder modelBuilder)  
    { 
     // folowwing is also necessary in case you're using identity model  
     base.OnModelCreating(modelBuilder);    
     modelBuilder.Entity<UObjects>()  
      .HasOptional<UObjects>(u => u.UParent) // EF'll load Parent if any  
      .WithMany(u => u.UObjects);  // load all childs if any 
    } 
+0

मैं श्रेणियों और उपश्रेणियों और कई स्थानों के लिए एक ही व्यवहार प्राप्त कर रहा हूं जहां आत्म संदर्भ की आवश्यकता है। अगर अभी भी वांछित परिणाम नहीं मिल रहे हैं तो कृपया स्वतंत्र महसूस करें –

+0

कन्स्ट्रक्टर में संग्रह आरंभ करना कड़ाई से जरूरी नहीं है। ईएफ इसे शून्य बना देगा जब यह शून्य है। –

1

ईएफ कोर में लगभग आपके लिए एक इकाई वर्ग आपके समान काम करता है। मैंने आपकी संपत्ति का नाम बदलकर ParentID से UParentID और कन्स्ट्रक्टर जोड़ा।

[Table("UObjects")] 
public class UObject 
{ 
    protected UObject() 
    { 
    UObjects = new List<UObject>(); 
    } 

    public UObject(UObject parent, string name) 
    : this() 
    { 
    Name = name; 
    UParent = parent; 
    UParent?.UObjects.Add(this); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long ID { get; set; } 
    public string Name { get; set; } 
    public long? UParentID { get; set; } 

    public virtual UObject UParent { get; set; } 
    public virtual ICollection<UObject> UObjects { get; set; } 
} 

ApplicationDBContext में मैं केवल इस राशि:

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    base.OnModelCreating(builder); 
    builder.Entity<UObject>(); 
} 

उपयोग (देखते हैं कि कैसे root ऑब्जेक्ट के गुणों को सही मान से भर रहे हैं): Eager loading

नोट: मैंने नहीं किया इस कोड में हटाने के बारे में परेशान करें। यदि आपको इसकी ज़रूरत है, तो चीजें शायद अधिक जटिल हो जाएंगी।

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