2011-11-19 10 views
5

में कई से जुड़ी हुई तालिकाओं से रिश्तों को जोड़ने पर प्राथमिक कुंजी उल्लंघन मैंने यहां पर कई प्रश्नों के माध्यम से पढ़ा है जो पहली बार ऐसी ही समस्या है, लेकिन ऐसा लगता है कि यह बिल्कुल समान नहीं है। अगर माफी माफी माँगती है तो इसका जवाब कहीं मिलता है लेकिन जैसा कि मैंने कहा है कि मैंने लोड के माध्यम से पढ़ा है और जवाब नहीं मिल रहा है।एमवीसी 3 इकाई फ्रेमवर्क

मैं एंटिटी फ्रेमवर्क और एमवीसी 3 का उपयोग कर रहा हूं। मैं अपने इकाई ढांचे में उत्पादों को टैग जोड़ने की कोशिश कर रहा हूं, जिनमें कई रिश्ते हैं और लिंक तालिका में केवल दो कुंजियों के साथ उन्हें जोड़ने वाली एक तालिका है , इसलिए ईएफ टैग की उत्पाद की संपत्ति में संक्रमित करता है। टेबल्स तो तरह स्थापित कर रहे हैं:

उत्पाद: ProductID [int, प्राथमिक कुंजी], नाम, आदि

टैग: टैगनाम [स्ट्रिंग, प्राथमिक कुंजी]

ProductTags: ProductID, टैगनाम

तो ProductTags तक पहुँचने के लिए मैं सिर्फ product.Tags

उपयोग कर सकते हैं यह मेरा कोड है:

dbProduct.Tags.Clear(); 
foreach (var tag in productModel.Tags) 
{ 
    Data.Tag dbTag = new Data.Tag(); 
    dbTag.TagName = tag; 
    dbProduct.Tags.Add(dbTag); 
} 

डीबी उत्पाद एक उत्पाद इकाई है, और डेटा नामस्थान है। ।।

"प्राथमिक KEY प्रतिबंध 'PK_Tags_1' वस्तु 'dbo.Tags' में डुप्लिकेट कुंजी सम्मिलित नहीं कर सकते का उल्लंघन \ r: productModel.Tags एक List<string>

जब मैं SaveChanges() मैं निम्न अपवाद प्राप्त है \ n कथन समाप्त हो गया है। "

तो वास्तव में मुझे क्या मिल रहा है: यह डब में कुछ भी जोड़ने की कोशिश क्यों कर रहा है। बैग? ऐसा लगता है कि यह केवल उत्पाद टैग्स में टैग नहीं जोड़ना चाहिए। मैं इस विधि में कहीं और टैग का कोई उल्लेख नहीं करता हूं और इसलिए किसी भी समय टैग टेबल में सीधे कुछ भी जोड़ने की कोशिश नहीं करता। ऐसा लगता है कि मेरे पास मेरे ईएफ में कुछ गलत हो सकता है लेकिन मुझे नहीं लगता कि डेटाबेस से क्या और इसे उत्पन्न किया गया था।

फिर से क्षमा करें अगर यह अंधेरे से स्पष्ट है, तो मैं बहुत बेवकूफ महसूस कर रहा हूं। किसी भी मदद की बहुत सराहना की।

उत्तर

11

समस्या यह है कि आप एक मौजूदा प्राथमिक कुंजी के साथ एक नया Tag ऑब्जेक्ट बना रहे हैं। जब SaveChanges() को ईएफ कहा जाता है, तो उन इकाइयों के परिवर्तनों का पता लगाता है जो इसकी पहले से ही ट्रैकिंग और नई संस्थाओं को जोड़ा गया है। चूंकि आपका नया Tag ऑब्जेक्ट ईएफ द्वारा ट्रैक नहीं किया गया था, इसलिए यह इसे सम्मिलित करने का प्रयास करता है।

आपको स्पष्ट रूप से ईएफ को बताना होगा कि निर्मित टैग एक मौजूदा है। ऐसा करने के लिए आपको attach की आवश्यकता है।

dbProduct.Tags.Clear(); 
foreach (var tag in productModel.Tags) 
{ 
    Data.Tag dbTag = new Data.Tag(); 
    dbTag.TagName = tag; 

    db.TagSet.Attach(dbTag); 

    dbProduct.Tags.Add(dbTag); 
} 

यह कोड मानता है कि आप एकल टैग को कई बार संलग्न नहीं कर रहे हैं और सभी टैग मौजूदा टैग हैं।

+0

ओह मीठे भगवान आपको धन्यवाद। मैं अटैच के साथ खेल रहा था लेकिन पूरी तरह गलत समझ गया कि यह कैसे काम करता है। यह तय है। दुर्भाग्य से मैं 'आपको वोट नहीं दे सकता' क्योंकि मैं नया साइन अप हूं लेकिन धन्यवाद। आपके पास कुछ अच्छा कर्म आपके रास्ते आ रहा है। – Smeats

+0

@ उपयोगकर्ता 1054799 महान। आप इसे स्वीकृत उत्तर के रूप में चिह्नित कर सकते हैं :) – Eranga

+0

हो गया। एक बार फिर धन्यवाद। – Smeats

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