7

मेरे पास सामग्री का एक वर्ग है जो माता-पिता के लिए विरासत के लिए सक्षम होना चाहिए, लेकिन मैं चाहता हूं कि यह बाल सामग्री की एक सूची हो जो कुछ भी नहीं है इस विरासत के पेड़ के साथ करने के लिए।एंटिटी फ्रेमवर्क कोड प्रथम श्रेणी के माता-पिता और उसी प्रकार के बच्चों के साथ प्रथम श्रेणी

मैं मूल रूप से एक लिंक टेबल चाहता था जैसे कि बच्चे के साथ बाल सामग्री के साथ संबंध और माता-पिता के लिए सामग्री और बाल सामग्री में बालकंटेंट रिलेशनशिप की एक सूची होगी।

इससे बहुत सारी त्रुटियां हुई हैं।

यहाँ मैं क्या तरह की

public class Content 
{ 
    public int Id { get; set; } 

    public int? ParentContentId { get; set; } 
    public virtual Content ParentContent { get; set; } 

    public string Name { get; set; } 

    public int ContentTypeId { get; set; } 
    public virtual ContentType ContentType { get; set; } 

    public virtual ICollection<Property> Properties { get; set; } 

    public virtual ICollection<ChildContentRelationship> ChildContent { get; set; } 
} 

मैं कैसे एफई में सेट कर होगा क्या करना चाहते है?

+0

एंटिटी फ्रेमवर्क का कौन सा संस्करण आप उपयोग कर रहे हैं और किस तरह का दृष्टिकोण (डीबी-फर्स्ट, मॉडल-फर्स्ट, कोड-फर्स्ट)? और आप एक लिंक टेबल क्यों चाहते हैं? क्या आपके पास एक से अधिक रिश्ते नहीं हैं, * एक * माता-पिता और * कई * बच्चे? – Slauma

+0

ईएफ 4.1 +, कोड पहले। यह इस माता-पिता सामग्री के कारण है। देखें कि मैं चाहता हूं कि सामग्री माता-पिता सामग्री प्रकार स्कीमा से किसी भी गुण का उत्तराधिकारी प्राप्त करने में सक्षम हो। लेकिन मैं यह भी चाहता हूं कि सामग्री का एक टुकड़ा अन्य सामग्री का संदर्भ हो जो कि इस पेड़ पदानुक्रम में नहीं है।ऐसा इसलिए है कि मैं बाल सामग्री, जैसे नियंत्रणों को प्रस्तुत कर सकता हूं। मैं इसे नियंत्रण के रूप में नामित कर सकता हूं और नियंत्रण में एक सामग्री है ID मुझे लगता है? –

+0

"कोड फर्स्ट" पहले से ही शीर्षक में था, मेरे द्वारा बेवकूफ़, मैंने यह नहीं देखा कि, क्षमा करें। – Slauma

उत्तर

18

मुझे यकीन नहीं है कि मैं आपके मॉडल को सही तरीके से समझता हूं या नहीं। आइए विकल्पों पर चर्चा करें।

एक क्षण के लिए मैं इस अतिरिक्त इकाई ChildContentRelationship छोड़ देते हैं और मुझे लगता है ChildContent संग्रह प्रकार ICollection<Content> की है।

  • विकल्प 1:

    मुझे लगता है कि ParentContentउलटा संपत्ति ChildContent की है। इसका मतलब यह होगा कि यदि आपके पास ContentId = x के साथ है और इस सामग्री में ChildContentId = y है तो चाइल्डकंटेंट्स ParentContentId हमेशा x होना चाहिए। यह केवल एक ही एसोसिएशन होगा और ParentContent और ChildContent इसी सहयोगी के अंत बिंदु हैं।

    इस रिश्ते के लिए मानचित्रण बनाया जा सकता है या तो डेटा एनोटेशन के साथ ...

    [InverseProperty("ParentContent")] 
    public virtual ICollection<Content> ChildContent { get; set; } 
    

    ... या Fluent एपीआई के साथ:

    modelBuilder.Entity<Content>() 
        .HasOptional(c => c.ParentContent) 
        .WithMany(c => c.ChildContent) 
        .HasForeignKey(c => c.ParentContentId); 
    

    मुझे लगता है कि यह नहीं है कि आप क्या चाहते ("... के साथ कुछ लेना देना नहीं है ...")। यद्यपि अपने नेविगेशन गुणों का नाम बदलने पर विचार करें। अगर कोई Parent... और Child... पढ़ता है तो वह बहुत ही अनुमान लगाएगा कि वे एक ही रिश्ते के लिए नेविगेशन गुणों की एक जोड़ी बनाते हैं।

  • विकल्प 2:

    ParentContentChildContent का प्रतिलोम संपत्ति जो मतलब यह होगा कि आप वास्तव में दो स्वतंत्र रिश्ते हैं और दोनों के रिश्तों के दूसरे endpoint अपने मॉडल वर्ग में उजागर नहीं किया गया है नहीं है।

    ParentContent के लिए मानचित्रण इस प्रकार दिखाई देगा:

    modelBuilder.Entity<Content>() 
        .HasOptional(c => c.ParentContent) 
        .WithMany() 
        .HasForeignKey(c => c.ParentContentId); 
    

    WithMany() पैरामीटर के बिना इंगित करता है कि दूसरे endpoint अपने मॉडल कक्षा में एक संपत्ति नहीं है, विशेष रूप से यह नहींChildContent है।

    अब सवाल यह है कि ChildContent किस तरह का रिश्ता है?क्या यह एक-से-कई है या क्या यह कई से अधिक रिश्तों है?

    • विकल्प 2 ए

      एक Content अन्य ChildContent रों को संदर्भित करता है और वहाँ एक दूसरे Content जो एक ही ChildContent रों को उल्लेख करता है (एक Content के बच्चों अद्वितीय हैं नहीं किया जा सकता है, तो बोलने के लिए) तो आपके पास एक से अधिक रिश्ते हैं। (यह एक आदेश और आदेश आइटम के बीच एक संबंध के समान है: एक आदेश आइटम केवल एक विशिष्ट क्रम के हैं कर सकते हैं।)

      ChildContent के लिए मानचित्रण इस प्रकार दिखाई देगा:

      modelBuilder.Entity<Content>() 
          .HasMany(c => c.ChildContent) 
          .WithOptional(); // or WithRequired() 
      

      आप एक होगा आपके डेटाबेस में Content तालिका में अतिरिक्त विदेशी कुंजी कॉलम जो इस एसोसिएशन से संबंधित है लेकिन इकाई वर्ग में संबंधित एफके संपत्ति नहीं है।

    • विकल्प 2 बी

      कई Content रों ही ChildContent रों का उल्लेख कर सकते हैं तो आप एक बहुत-से-अनेक संबंध हैं। (यह एक उपयोगकर्ता और भूमिकाओं के बीच एक संबंध के समान है: बहुत से उपयोगकर्ताओं को एक ही भूमिका के भीतर नहीं हो सकता है और यदि कोई उपयोगकर्ता कई भूमिकाएं हैं कर सकते हैं।)

      ChildContent के लिए मानचित्रण इस प्रकार दिखाई देगा:

      modelBuilder.Entity<Content>() 
          .HasMany(c => c.ChildContent) 
          .WithMany() 
          .Map(x => 
          { 
           x.MapLeftKey("ParentId"); 
           x.MapRightKey("ChildId"); 
           x.ToTable("ChildContentRelationships"); 
          }); 
      

      यह मानचित्रण डेटाबेस में एक तालिका तालिका ChildContentRelationships बनाएगा, लेकिन आपको इस तालिका के लिए संबंधित इकाई की आवश्यकता नहीं है।

    • विकल्प 2c

      केवल मामला यह है कि कई-से-अनेक संबंध दो कुंजियों (ParentId और ChildId) के अलावा अधिक गुण (CreationDate या RelationshipType या जैसे उदाहरण के कुछ करने के लिए ...) है में

      +०१२३५१६४१०६१:

      public class ChildContentRelationship 
      { 
          [Key, Column(Order = 0)] 
          public int ParentId { get; set; } 
          [Key, Column(Order = 1)] 
          public int ChildId { get; set; } 
      
          public Content Parent { get; set; } 
          public Content Child { get; set; } 
      
          public DateTime CreationDate { get; set; } 
          public string RelationshipType { get; set; } 
      } 
      

      अब आप अपने Content वर्ग ChildContentRelationship रों का एक संग्रह होता है: आप अपने मॉडल में एक नई इकाई ChildContentRelationship पेश करने के लिए होता है

      public virtual ICollection<ChildContentRelationship> ChildContent 
          { get; set; } 
      

      और तुम दो एक-से-कई रिश्ते हैं:

      modelBuilder.Entity<ChildContentRelationship>() 
          .HasRequired(ccr => ccr.Parent) 
          .WithMany(c => c.ChildContent) 
          .HasForeignKey(ccr => ccr.ParentId); 
      
      modelBuilder.Entity<ChildContentRelationship>() 
          .HasRequired(ccr => ccr.Child) 
          .WithMany() 
          .HasForeignKey(ccr => ccr.ChildId); 
      

मुझे विश्वास है कि आप या तो विकल्प 2 ए या 2 बी चाहते हैं, लेकिन मुझे यकीन है कि नहीं हूँ।

+2

इसे साफ़ करने के लिए धन्यवाद, मुझे लगता है कि मैं विकल्प 2 बी की तलाश में हूं, शायद नामकरण की आवश्यकता है। मुझे लगता है कि यह वास्तव में एक नियंत्रण है और इसलिए शायद एक अलग वर्ग/डिजाइन की जरूरत है। मैं कल कोशिश करूंगा। –

+1

यह एक उत्तर है! :) –

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