2009-05-28 21 views
10

previous question पर आगे बढ़ रहा था। मान लें कि मैं ब्लॉग सेन्ट्री और पोस्ट से टिप्पणी प्राप्त करता हूं। अब मैं उन्हें थोड़ा सा अनुकूलित करना चाहता हूं। एक ब्लॉग पोस्ट के लिए एक टिप्पणी एक शीर्षक की जरूरत नहीं है, लेकिन एक टिप्पणी एक उपयोगकर्ता संदर्भ की जरूरत है तो मैं इस तरह पोस्ट से और टिप्पणी में बाहर इन दो क्षेत्रों के लिए कदम और ब्लॉग प्रविष्टि:ईएफ 4 - कस्टम ऑब्जेक्ट कॉन्टेक्स्ट और विरासत प्रश्न

public abstract class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual DateTime CreatedAt { get; set; } 
} 

public class BlogEntry : Post 
{ 
    public virtual string Header { get; set; } 
    public virtual Blog Blog { get; set; } 
    public virtual IEnumerable<Comment> Comments { get; set; } 
} 

public class Comment : Post 
{ 
    public virtual string Header { get; set; } 
    public virtual int UserId { get; set; } 
    public virtual BlogEntry BlogEntry { get; set; } 
} 

अब मैं अपने कस्टम वस्तु प्रसंग बना :

public class EntityContext : System.Data.Objects.ObjectContext 
{ 
    public EntityContext() : base("name=Entities", "Entities") 
    { 
     this.Blogs = CreateObjectSet<Blog>(); 
     this.Posts = CreateObjectSet<Post>(); 
     this.Entries = CreateObjectSet<BlogEntry>(); 
     this.Comments = CreateObjectSet<Comment>(); 
    } 
    public ObjectSet<Blog> Blogs { get; set; } 
    public ObjectSet<Post> Posts { get; set; } 
    public ObjectSet<BlogEntry> Entries { get; set; } 
    public ObjectSet<Comment> Comments { get; set; } 
} 

यह मैं देता निम्नलिखित वास्तव में काफी वर्णनात्मक त्रुटि संदेश:

टेस्ट विधि फेंक दिया अपवाद: System.ArgumentException: वहाँहैंकोई एंटीटीसेट्स निर्दिष्ट इकाई प्रकार 'BlogEntry' के लिए परिभाषित नहीं है। यदि 'BlogEntry' एक व्युत्पन्न प्रकार है, तो इसके बजाय आधार प्रकार का उपयोग करें। उदाहरण के लिए, आपको यह त्रुटि दिखाई देगी यदि आपने CreateObjectSet() और डिस्कंटिन्यूड प्रोडक्ट एक ज्ञात इकाई प्रकार है लेकिन सीधे एंटिटीसेट में मैप नहीं किया गया है। DiscontinuedProduct प्रकार एक व्युत्पन्न प्रकार जहां पेरेंट प्रकार EntitySet या DiscontinuedProduct प्रकार से मैप किया गया है बिल्कुल एक EntitySet मैप नहीं किया जा सकता है हो सकता है। पैरामीटर नाम: TEntity

अब मैं नहीं कर रहा हूँ विरासत और सामान लेकिन जिस तरह से मैं देख रहा हूँ इस ObjectSet < पोस्ट> है कि मेरी समस्याओं का समाधान के रूप में प्रविष्टियों और टिप्पणियाँ का एक सेट को जोड़ने के लिए किया जाएगा की एक मास्टर?

उत्तर

11

आप एक आधार प्रकार (अर्थात Post) आप व्युत्पन्न प्रकार के लिए एक भी नहीं बना सकते, क्योंकि आप उस एक ObjectSet से वंशानुगत पदानुक्रम में सभी प्रकार के उदाहरण प्राप्त कर सकते हैं के लिए एक ObjectSet बनाते हैं।

यानी ctx.Posts.OfType<BlogEntry>() ब्लॉगइन्ट्री वापस लौटाएगा।

तो जवाब बस दो अन्य सेटों को हटाना है।

यो एक ऐड उदाहरण के लिए आप यह कर सकते हैं करने के लिए की जरूरत है: बिल्कुल

ctx.Posts.AddObject(new BlogEntry {....}); 

कोई बात नहीं।

मदद करने के लिए आप और अधिक आसानी से प्रश्नों लिखने आप शायद अपने ObjectContext है कि इस तरह देखने के लिए गुण की एक जोड़ी जोड़ सकते हैं:

public ObjectQuery<BlogEntity> Blogs{ 
    get{ 
     return ctx.Posts.OfType<BlogEntry>() as ObjectQuery<BlogEntry>; 
    } 
} 

और टिप्पणियों के लिए ही।

आशा इस

एलेक्स

+0

में मदद करता है हाँ मैं नहीं किया है समय आगे इस पर गौर करने के लिए। आप जो कहते हैं वह सच लगता है। मैंने आज अपने निष्कर्षों के बारे में एक विशाल ब्लॉग पोस्ट लिखना समाप्त कर दिया। ऐसा लगता है कि मुझे कल पीओसीओ विरासत के बारे में एक और लिखना है :) – mhenrixon

+0

बस बैग को हटाने के साथ टिप के लिए धन्यवाद! :) – mhenrixon

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