2012-11-09 12 views
12

मैं स्वतः अपने डेटाबेस स्कीमा बनाने के लिए इकाई की रूपरेखा कोड-पहले उपयोग कर रहा हूँ, और मेरे संस्थाओं में से एक इस तरह दिखता है:ईएफ कोड-पहला क्यों एक बाहरी विदेशी कुंजी कॉलम उत्पन्न कर रहा है?

public class AssessmentsCaseStudies { 
    #region Persisted fields 
    [Required] 
    [Key, Column(Order=0)] 
    [ForeignKey("Assessment")] 
    public int AssessmentId { get; set; } 

    [Required] 
    [Key, Column(Order=1)] 
    [ForeignKey("CaseStudy")] 
    public int CaseStudyId { get; set; } 

    [Required] 
    public int Score { get; set; } 

    [ForeignKey("Follows")] 
    public int? FollowsCaseStudyId { get; set; } 
    #endregion 

    #region Navigation properties 
    public virtual Assessment Assessment { get; set; } 
    public virtual CaseStudy CaseStudy { get; set; } 
    public virtual CaseStudy Follows { get; set; } 
    #endregion 
} 

जब एफई मेरी डेटाबेस ऑटो उत्पन्न करता है, यह निम्नलिखित कॉलम के साथ एक मेज उत्पन्न करता है :

AssessmentId (PK, FK, int, not null) 
CaseStudyId (PK, FK, int, not null) 
Score (int, not null) 
FollowsCaseStudyId (FK, int, null) 
CaseStudy_CaseStudyId (FK, int, null) 

यह सब ठीक CaseStudy_CaseStudyId स्तंभ से अलग है। यह क्यों उत्पन्न हुआ है? ये किसके लिये है? मैं इसे उत्पन्न होने से कैसे रोक सकता हूं? मेरा संदेह यह है कि ईएफ CaseStudy के ICollection<AssessmentsCaseStudies>CaseStudyId कॉलम के साथ स्वचालित रूप से मेल नहीं खा सकता है, इसलिए यह उस नेविगेशन प्रॉपर्टी के लिए दोनों को एक साथ जोड़ने के लिए अपना कॉलम बनाता है।

+0

मैं वास्तव में उस प्रश्न के स्वीकृत उत्तर को समझ नहीं पा रहा हूं। मेरे पास 'आकलन कैसस्टूडीज' में सटीक दो 'केसस्टूडी' संदर्भ हैं, इसलिए मेरे पास कई से अधिक रिश्ते नहीं हैं और मुझे नहीं लगता कि मुझे जंक्शन तालिका क्यों चाहिए। मेरे पास 'सार्वजनिक वर्चुअल आईसीलेक्शन <आकलन कैसस्टूडीज> आकलन केस स्टडीज {प्राप्त करें; सेट; } 'केसस्टूडी' में, हालांकि, मुझे यह कहना एक तरीका चाहिए कि आईसीओलेक्शन को 'केसस्टूडीआईडी' एफके से संबंधित होना चाहिए, न कि 'FollowsCaseStudyId' FK। – Jez

+0

ठीक है, मैंने सोचा कि इसमें उपयोगी जानकारी हो सकती है। क्या आप एक ट्रिम किए गए उदाहरण को बनाने का प्रयास कर सकते हैं, उदाहरण के लिए केवल 'आकलन', 'केसस्टूडी' और 'आकलन कैसस्टूडी' इकाई के साथ, प्रत्येक में केवल 'आईडी' फ़ील्ड और 'AssesmentCaseStudy' युक्त' AssesmentID' और 'CaseStudyID' 'फ़ील्ड? क्या समस्या तब भी होती है? – CodeCaster

+1

मुझे नहीं लगता कि यह प्रश्न बंद कर दिया जाना चाहिए क्योंकि "डुप्ले" प्रश्न का स्वीकृत उत्तर चीजों को अच्छी तरह से समझाता नहीं है और मुझे बेहतर जवाब चाहिए। फिर से खोलने के लिए वोट दें। – Jez

उत्तर

7

किसी कारण से, स्लैमा के InverseProperty विशेषता सुझाव काम नहीं किया।

modelBuilder.Entity<AssessmentsCaseStudies>() 
    .HasRequired(acs => acs.CaseStudy) 
    .WithMany(cs => cs.AssessmentsCaseStudies) 
    .HasForeignKey(acs => acs.CaseStudyId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<AssessmentsCaseStudies>() 
    .HasOptional(acs => acs.Follows) 
    .WithMany() // No reverse navigation property 
    .HasForeignKey(acs => acs.FollowsCaseStudy) 
    .WillCascadeOnDelete(false); 

एक बार है कि जोड़ दिया जाता है, प्रवास कोड है कि जब उत्पन्न: क्या काम किया है मुझे मेरे डेटाबेस संदर्भ के OnModelCreating विधि में AssessmentsCaseStudies में दो CaseStudy नेविगेशन गुण के बीच संबंध, और CaseStudy इकाई का उल्लेख करते समय सुविज्ञ एपीआई के माध्यम से था मैं Add-Migration अब CaseStudy_CaseStudyId कॉलम जोड़ने की कोशिश नहीं करता है और मुझे उपयुक्त विदेशी कुंजी संबंध के साथ FollowsCaseStudyId कॉलम जोड़ा गया है।

+0

क्या आपको 'इनवर्क्सप्रोपर्टी' के साथ अपवाद मिला विशेषता है या आपके पास अभी भी तीसरा एफके है? यह काम करना चाहिए था। यह आपके फ़्लुएंट मैपिंग जैसा ही है - एक अपवाद के साथ: विशेषता पहले रिश्ते के लिए कैस्केडिंग डिलीट अक्षम नहीं करती है (दूसरी कैस्केडिंग डिलीट डिफ़ॉल्ट रूप से बंद होती है क्योंकि यह एक वैकल्पिक संबंध है)। – Slauma

+0

यह अभी भी तीसरा एफके बनाया गया है। – Jez

16

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

इस तरह के एक अस्पष्ट स्थिति में एफई सम्मेलन वास्तव में बनाने के लिए है तीन रिश्ते, यानी CaseStudy में अपने संग्रह दो CaseStudy नेविगेशन गुण में से किसी का उल्लेख नहीं करता लेकिन एक तिहाई है (लेकिन नहीं उजागर किया है और "अदृश्य") AssessmentsCaseStudies में एंडपॉइंट। यह तीसरा रिश्ते डेटाबेस में तीसरे विदेशी कुंजी का कारण है - अंडरस्कोर वाला वाला। (अंडरस्कोर हमेशा एक मजबूत संकेत है कि कुछ मानचित्रण प्रथा के अनुसार और आपकी स्पष्ट विन्यास या डेटा एनोटेशन द्वारा नहीं happend है।)

समस्या को ठीक करने और सम्मेलन आप [InverseProperty] विशेषता लागू कर सकते हैं ओवरराइड करने के लिए, जिससे CaseStudy नेविगेशन को निर्दिष्ट संपत्ति AssessmentsCaseStudies संग्रह अंतर्गत आता है करने के लिए:

[InverseProperty("AssessmentsCaseStudies")] // the collection in CaseStudy entity 
public virtual CaseStudy CaseStudy { get; set; } 

तुम भी (वैकल्पिक रूप से, आप दोनों की जरूरत नहीं है) कर सकते हैं संग्रह तरफ विशेषता डाल:

[InverseProperty("CaseStudy")] // the CaseStudy property in AssessmentsCaseStudies entity 
public virtual ICollection<AssessmentsCaseStudies> AssessmentsCaseStudies { get; set; } 
+0

मैं कुछ इसी तरह से निपट रहा हूं - मैंने आपके सुझाव की कोशिश की लेकिन अपवाद मिला। यदि आपके पास एक मिनट है: http://stackoverflow.com/questions/19802324/why-is-this-column-getting-generated-in-ef-code-first-migrations – RobVious

0

किसी और के लिए समाधान ढूंढने के लिए यहां लैंडिंग के लिए, यदि आपने पिछले उत्तरों की कोशिश की है और अभी भी एक अतिरिक्त विदेशी कुंजी कॉलम प्राप्त कर रहे हैं, तो आप अपने पीओसीओ वर्ग को नीचे परिभाषित कर सकते हैं कि किसी भी गुण की तलाश करें जिसे आपने इरादा नहीं किया था डीबी क्षेत्रों में मैप करने के लिए। यहां तक ​​कि यदि उनमें कोड ब्लॉक होते हैं, जैसे जटिल एक्सेसर्स के साथ, इकाई फ्रेमवर्क उन्हें किसी भी तरह डेटाबेस में मैप करने का प्रयास करेगा। यदि आपकी संपत्तियां वापस लौटती हैं तो इसका परिणाम अतिरिक्त विदेशी कुंजी कॉलम हो सकता है। सुरक्षित होने के लिए, या तो [NotMapped] विशेषता के साथ ऐसी गुणों को सजाने या उन्हें विधियों में परिवर्तित करें।

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