2013-04-29 6 views
18

के साथ संदर्भ में नई इकाई डालें मैं अपनी SQL तालिका में एक नया रिकॉर्ड डालना चाहता हूं। मैंने कोशिश की:पहचान प्राथमिक कुंजी

 public void CreateComment(int questionId, string comment) 
     { 
      QuestionComment questionComment = context.TableName.Create();//1* 
      questionComment.propertyThatIsNotAConstraint= questionId; 
      questionComment.body = comment; 
      context.QuestionComments.Add(questionComment); 
      context.SaveChanges();//ERROR... 
     } 

1 * मैं देखने के लिए IntelliSense मुझे बताओ हैरान हूँ: "ध्यान दें कि नई इकाई में नहीं जोड़ा या सेट से जुड़ा हुआ है"

त्रुटि पुस्तकें:

"प्राथमिक कुंजी बाधा का उल्लंघन 'PK_TableName'। ऑब्जेक्ट 'dbo.TableName' में डुप्लिकेट कुंजी सम्मिलित नहीं कर सकता। डुप्लिकेट कुंजी मान (0) है। \ R \ n कथन समाप्त कर दिया गया है।"

समस्या questionComment अपने पी है कि: questionComment.Id0 को चूक। इसे अगली उपलब्ध पहचान या अन्यथा पॉप्युलेट नहीं किया जाना चाहिए और "सामान्य" पहचान डालने की आवश्यकता है।

इकाई ढांचे से मुझे इस स्केनेरियो को संभालने की उम्मीद कैसे होती है?

अनुरोध के रूप में:

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

    namespace Feedback.Models 
    { 
     using System; 
     using System.Collections.Generic; 

     public partial class QuestionComment 
     { 
      public int id { get; set; } 
      public int questionId { get; set; } 
      public string body { get; set; } 
      public int commentIndex { get; set; } 
     } 
    } 
+1

पर सेट किया जाता है कि' बुला SaveChanges के बाद, 'newCommentObject। प्रश्न आईडी में डेटाबेस द्वारा नई जेनरेट की गई कुंजी होगी। – haim770

+0

@ haim770 - मैंने सही त्रुटि के साथ प्रश्न और त्रुटि का स्थान अपडेट किया। अगर कुछ तंत्र या आदेश है जो इसे हल कर सकता है तो कृपया एक उत्तर पोस्ट करें। –

+0

मैं आमतौर पर ऐसा कुछ करता हूं: डेटाबेस में मेरी 'पहचान' 1 से ऊपर जाती है; सी # में मेरी नई इकाइयां "नकली" पीके मान -1 नीचे से प्राप्त होती हैं - तब तालिका में वास्तविक डालने पर उन्हें बदल दिया जाएगा (लेकिन अलग, अलग "नकली" पीके मान होने से सुनिश्चित करें कि आप संस्थाओं के साथ काम कर सकते हैं ठीक है , और उन्हें अन्य संस्थाओं से भी संदर्भित करें!) –

उत्तर

33

मैं द्वारा यह तय:

  1. एसक्यूएल पर जाकर तालिका करने के लिए सुनिश्चित करें कि "पहचान विशिष्टता" है बनाना> पहचान> हां पर सेट है। फिर यदि आप डीबी परिवर्तन करना चाहते हैं तो * .edmx फ़ाइल को अपडेट करें।

  2. चेक * .edmx> इकाई गुण> सुनिश्चित करने के लिए पहचान के लिए StoreGeneratedPattern यह() `पहचान

enter image description here

+0

दोस्त, मैं अपने बालों को उसी त्रुटि से फाड़ रहा था, मुझे एहसास नहीं हुआ कि मैंने पहचान कॉलम नहीं बनाया होगा। धन्यवाद! (हाँ, मुझे पता है, "धन्यवाद" टिप्पणियां फंसे हुए हैं) –

+0

धन्यवाद आदमी, मुझे वही समस्या थी जो आपने मुझे बचाया! – Izekid

+0

.edmx फ़ाइल को अपडेट करना मेरे लिए काम नहीं करता है। मुझे .edmx से तालिका को हटाना था और इसे फिर से जोड़ना था। – Ravvy

4

एफई प्रलेखन कहा गया है कि डेटाबेस एक मूल्य जब एक पंक्ति propConfig.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)

http://msdn.microsoft.com/en-us/library/hh829109(v=vs.103).aspx

के साथ विन्यस्त दूसरे शब्दों में स्तंभों के लिए डाला जाता है उत्पन्न करता है। ईएफ डेटाबेस पर डालने पर newCommentObject.Id मूल्य पर ध्यान नहीं देगा। इसके बजाय, यह डेटाबेस को अगली पहचान मान उत्पन्न करने की अनुमति देगा।

+0

मुझे यकीन नहीं है कि यह मेरी स्थिति में कैसे लागू करें। मैं इस संपत्ति से परिचित नहीं हूँ। क्या आप दिखा सकते हैं कि यह मेरे प्रश्न पर कैसे लागू होता है? दूसरे शब्दों में, कोड जो त्रुटि को ठीक करने का तरीका दिखाता है। –

+0

संभवतः आपने अपनी प्रश्नपत्र तालिका सेट अप की है। यदि आपने ईएफ की धाराप्रवाह एपीआई का उपयोग किया है तो यह 'मॉडलबिल्डर। एंटीटी <प्रश्न टिप्पणी>() जैसा दिख सकता है। हैस्की (सी =>/* * /); '। आप 'modelbuilder.Entity () होने के लिए सेटअप को मोफ़िफ़ाई कर सकते हैं। हैस्की (सी => सी.आईडी/* यदि आईडी तालिका के लिए प्राथमिक कुंजी है * /); या' मॉडलबिल्डर। एंटीटी <प्रश्नपत्र ' >() .हैस्की (सी =>/* * /)। संपत्ति (सी => सी.आईडी) .सडेटाबेस जेनरेटेडऑप्शन (डाटाबेस जेनरेटेडऑप्शन.इडेन्टिटी); ' मैं शायद प्रश्नोत्तरों पर आईडी बनाने की सिफारिश करता हूं, प्राथमिक कुंजी टेबल क्योंकि ऐसा लगता है जैसे यह है। –

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