2010-03-19 5 views
15

मेरे पास एक SQLite डीबी है जो स्थापित है ताकि जब मैं किसी व्यक्ति को हटा दूं तो डिलीट कैस्केड हो। यह ठीक काम करता है जब मैं मैन्युअल रूप से एक व्यक्ति को हटाता हूं (पर्सिड आईडी का संदर्भ देने वाले सभी रिकॉर्ड हटा दिए जाते हैं)। लेकिन जब मैं इकाई की रूपरेखा व्यक्ति को नष्ट करने के लिए उपयोग मैं कोई त्रुटि मिलती है:एंटिटी फ्रेमवर्क और सिस्टम का उपयोग कर कैस्केड डिलीट के साथ समस्या। डेटा। SQLite

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

मुझे समझ नहीं आता क्यों यह हो रहा है। मेरा ट्रिगर उस ऑब्जेक्ट को हटाने से पहले सभी संबंधित ऑब्जेक्ट्स को साफ़ करने के लिए सेट है जिसे हटाने के लिए कहा गया था।

जब मैं मॉडल संपादक में जाता हूं और रिश्ते के गुणों की जांच करता हूं तो यह ऑनडेले संपत्ति के लिए कोई कार्रवाई नहीं दिखाता है। डीबी से खींचकर यह सेट सही ढंग से क्यों नहीं है? यदि मैं इस मूल्य को कैस्केड में बदलता हूं तो सब ठीक से काम करता है, लेकिन मैं इस मैन्युअल परिवर्तन पर भरोसा नहीं करता क्योंकि अगर मैं डीबी से अपना मॉडल रीफ्रेश करता हूं और यह उसे खो देता है।

यहां मेरी टेबल के लिए रिलायंस एसक्यूएल है।

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE 
) 
CREATE TABLE [Person] 
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT 
) 

उत्तर

24

मैंने अभी इस सटीक मुद्दे से निपटाया है। यह पता चला कि जब मैंने Update model from database... विकल्प पर ईएफ का उपयोग किया, तो इसे हटाने के लिए "कैस्केड" नियम ठीक से नहीं मिला।

अपने ईएफ डेटाबेस मॉडल पर जाने का प्रयास करें, समस्या उत्पन्न करने वाले एसोसिएशन पर क्लिक करें, फिर सुनिश्चित करें कि End1 OnDelete (एंड 2 हो सकता है, डेटाबेस योजना पर निर्भर करता है) Cascade पर सेट है।

+0

यदि आपको एंड 1 या एंड 2 अपडेट करना चाहिए तो क्या काम करने का कोई तरीका है? या यह सिर्फ परीक्षण और त्रुटि है? –

+1

यह आपके डेटाबेस के मॉडल के तरीके पर निर्भर करता है।यदि आपके पास एक से अधिक रिश्तों हैं, तो 'एक' अंत को 'कैस्केड' – Omar

1

मुझे प्रदाता बग की तरह लगता है। कैस्केड डीबी से उठाया जाना चाहिए। इसे SQL सर्वर के साथ आज़माएं; आप देखेंगे कि यह वहां काम करता है। आपको यह भी रिपोर्ट करनी चाहिए कि आपने जो भी अपना SQLite प्रदाता लिखा है।

+0

मैं सत्यापित कर सकता हूं कि इसकी (केवल) एक SQLite प्रदाता बग नहीं है। कैस्केड जोड़ना SQL सर्वर में मॉडल में प्रतिबिंबित नहीं होता है जब तक कि आप पूरे मॉडल को हटा दें और फिर से बनाएं। दर्द। – Andiih

+0

@Andiih, केवल अगर इकाई को उनके बिना जोड़ा गया है (संभवतः गलत तरीके से)। डिजाइनर आपके कस्टम सीएसडीएल को ओवरराइट नहीं करता है। यह वास्तव में एक विशेषता है। –

+0

हां, मैंने डेटाबेस डिज़ाइन में गड़बड़ कर ली थी। मैंने सीएसडीएल को अनुकूलित नहीं किया था। क्या पूरे मॉडल को हटाने और फिर से जोड़ने के बिना ताज़ा करने का कोई तरीका है? – Andiih

4

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

हालांकि, जब मैंने एक ही सटीक तालिकाओं के साथ एक नया मॉडल बनाया, तो उसने कैस्केड नियम उठाए। तो मेरा समाधान सिर्फ पुराने मॉडल को हटाने और उसी नाम के साथ एक नया निर्माण करने के लिए था,

मुझे लगता है कि डेटाबेस प्रक्रिया से अद्यतन मॉडल में कुछ गड़बड़ है।

+1

पर सेट किया जाना चाहिए, मुझे एसक्यूएल सर्वर –

+1

के साथ यह समस्या थी, मैं उसी समस्या की पुष्टि भी कर सकता हूं – Andiih

+0

डिज़ाइनर मौजूदा सीएसडीएल को कभी ओवरराइट नहीं करेगा। क्योंकि आप आमतौर पर अपने अनुकूलन रखना चाहते हैं। इस मामले में, आप नहीं करते हैं, लेकिन यह सामान्य मामला नहीं है। –

0

आप केवल विदेशी कुंजी संपत्ति का उपयोग किए बिना नेविगेशन संपत्ति का उपयोग कर सकते हैं। डिलीट कैस्केड कोड में समस्या का समाधान नहीं करता है क्योंकि आपकी व्यक्ति ऑब्जेक्ट को हटाए गए के रूप में चिह्नित नहीं किया जाएगा।