2012-08-14 26 views
9

मैं डेटाबेस माइग्रेशन स्क्रिप्ट बनाने के लिए ईएफ 4.3 माइग्रेशन सुविधा का उपयोग कर रहा हूं। जब मैं ऐड-प्रवासन आदेश चलाएं उत्पन्न स्क्रिप्ट इतनी के रूप में बनाया जाता है:EntityFramework माइग्रेशन कैस्केडडिलेट पैरामीटर

 CreateTable(
      "dbo.Recipients", 
      c => new 
       { 
        RecipientID = c.String(nullable: false, maxLength: 128), 
        SurveyRoundID = c.String(nullable: false, maxLength: 128), 
        LastUpdatedAt = c.DateTime(), 
       }) 
      .PrimaryKey(t => t.RecipientID) 
      .ForeignKey("dbo.Employees", t => t.EmployeeID, cascadeDelete: true) 
      .ForeignKey("dbo.SurveyRounds", t => t.SurveyRoundID, cascadeDelete: true) 
      .Index(t => t.EmployeeID) 
      .Index(t => t.SurveyRoundID); 

समस्या मेरे पास है scafolding प्रवास cascadeDelete चुनें सच होना भले ही इकाई प्राप्तकर्ता संबंध का मालिक नहीं है।

अभी के लिए मैं मैन्युअल रूप से cascadeDelete पैरामीटर को गलत में बदल रहा हूं लेकिन मैं जानना चाहता हूं कि यह डिफ़ॉल्ट रूप से क्यों सही चुन रहा है।

धन्यवाद, इडौ।

उत्तर

8

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

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

+0

क्या आप जानते हैं कि माइग्रेशन में 'एसक्यूएल (..)' के साथ डीडीएल का उपयोग किए बिना 'डिलीट सेट नल पर' कैसे परिभाषित किया जाए? – JoeBrockhaus

11

उत्तर के लिए धन्यवाद, इससे मुझे मदद मिली क्योंकि मैं ध्यान दे रहा था और कभी-कभी डेटाबेस अपडेट करने का प्रयास करते समय त्रुटियां हो रही थी क्योंकि मेरे कई वर्गों में कैस्केड को आदर्श बनाने के लिए कई रिश्ते हैं।

कृपया झरना डिफ़ॉल्ट सेटिंग हटाना दूर करने के लिए नीचे देखें:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
} 

यह जाना अंदर प्रसंग वर्ग।

+0

बिल्कुल वही जो मैं खोज रहा था! – Mixxiphoid

+1

यह मेरे लिए ठीक काम करता है। ऑप्ट-आउट की बजाय यह वास्तव में ऑप्ट-इन होना चाहिए! –