2015-09-23 9 views
5

मैं एफई में एक पंक्ति को अपडेट करना चाहते हैं: जब अद्यतन करने मैं इस संदेश हैइकाई की रूपरेखा अद्यतन विफलता

Case newCase = new Case(...); 
dbContext.Entry(newCase).State = EntityState.Modified; 
dbContext.SaveChanges(); 

:

Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded

कोई संगामिति नहीं है, के बाद से मैं पर डाटाबेस का उपयोग कर रहा है मेरी मशीन।

अगर मैं Sql प्रोफाइलर करने के लिए जाने वाली क्वेरी निष्पादित किया जाता है देखने के लिए, शर्त है:

कहां [ID] = @ p0 और [RowVersion] = @ p14;

इस स्थिति में, @ p0 is = 1 और @ p14 पूर्ण है, बिल्कुल रिकॉर्ड की तरह जिसे मैं संशोधित करना चाहता हूं। लेकिन अगर मैं क्वेरी के RowVersion भाग को हटाने के बाद मैन्युअल रूप से SQL सर्वर में यह क्वेरी लॉन्च करता हूं, तो यह 1 पंक्ति को अद्यतन करता है।

समस्या क्या हो सकती है और मैं इसे कैसे हल कर सकता हूं?

संपादित करें:

मैं सिर्फ यह अद्यतन करने से पहले रिकॉर्ड का चयन करने की कोशिश की है, लेकिन त्रुटि में ही है:

An exception of type 'Microsoft.Data.Entity.DbUpdateConcurrencyException' occurred in EntityFramework.Core.dll but was not handled in user code

Additional information: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.

और यहाँ:

IEnumerable<Case> cases = from c in dbContext.Cases where c.Id.ToString() == "1" select c; 
    Case cs = cases.SingleOrDefault(); 
    dbContext.Entry(cs).State = EntityState.Modified; 
    dbContext.SaveChanges(); 

यहाँ पूरा त्रुटि है एसक्यूएल प्रोफाइलर से पूछताछ है:

exec sp_executesql N'SET NOCOUNT OFF; 

अद्यतन [केस] सेट [बंद] = @ पी 1, [टिप्पणी] = @ पी 2, [संपर्क टिप्पणी] = @ पी 3, [संपर्क आईडी] = @ पी 4, [बनाया गया] = @ पी 5, [निर्मितडेट टाइम] = @ पी 6, [ विवरण] = @ पी 7, [ईमेल] = @ पी 8, [LastModifiedBy] = @ पी 9, [LastModifiedDateTime] = @ p10, [OpenedDateTime] = @ p11, [phone] = @ p12, [RowVersion] = @ p13, [SlaConsumedTime ] = @ पी 15, [स्लासस्पेन्ड] = @ पी 16, [स्लाटोटलटाइम] = @ पी 17, [स्थिति] = @ पी 18, [शीर्षक] = @ पी 1 9 जहां [आईडी] = @ पी 0 और [रोवर्सियन] = @ पी 14;

SELECT @@ ROWCOUNT; ', एन' @ पी 0 इंट, @ पी 1 बिट, @ पी 2 nvarchar (अधिकतम), @ पी 3 nvarchar (अधिकतम), @ पी 4 int, @ पी 5 int, @ पी 6 डेटाटाइम 2 (7), @ पी 7 nvarchar (4000), @ पी 8 nvarchar (4000), @ पी 9 int, @ पी 10 डेटाटाइम 2 (7), @ पी 11 डेटाटाइम 2 (7), @ पी 12 nvarchar (अधिकतम), @ पी 13 varbinary (अधिकतम), @ पी 14 varbinary (अधिकतम), @ पी 15 समय (7), @ पी 16 बिट, @ पी 17 समय (7), @ पी 18 इंट, @ पी 1 9 एनवार्चर (4000) ', @ पी 0 = 1, @ पी 1 = 0, @ पी 2 = एनयूएलएल, @ पी 3 = एनयूएलएल, @ पी 4 = 0, @ पी 5 = 1, @ पी 6 = '2015-09-23 09: 07: 55.7041023', @ p7 = n'y ', @ p8=N'[email protected]', @ p9 = 1, @ p10 = ' 2015-09-23 09: 50: 02.9934006 ', @ p11 =' 2015-09-23 09: 07: 55.6796028 ', @ p12 = NULL, @ p13 = NULL, @ p14 = NULL, @ p15 = '00: 00 : 00 ', @ p16 = 0, @ p17 = '00: 00: 00', @ p18 = 0, @ p19 = n'y '

+0

आपकी 'केस' इकाई में निश्चित रूप से 'रोवर्सियन' संपत्ति है, इसका उपयोग समवर्ती जांच के लिए किया जाता है। लेकिन जब आप 'नया' के साथ 'केस' बनाते हैं, तो उस प्रॉपर्टी *** में मूल रूप से डेटाबेस में संग्रहीत मूल मान नहीं है।तो WHERE स्थिति विफल हुई, आपको 'SaveChanges()' को कॉल करने से पहले डेटाबेस से प्राप्त कुछ मूल्य के साथ 'RowVersion' के लिए मूल मान मैन्युअल रूप से सेट करना होगा। – Hopeless

+0

'dbContext.Cases.Add (newCase) '(यह एक नई वस्तु है, मौजूदा नहीं है) –

+0

आप उस ऑब्जेक्ट को अपडेट करने का प्रयास कर रहे हैं जो डेटाबेस में मौजूद नहीं है। – trailmax

उत्तर

0

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

+1

कोई आईडी सेट नहीं है, जैसा कि मैंने कहा था कि स्थिति कहां है [आईडी] = पी 0 और पी 0 = 1। – Sean

1

इसके कारण, Null के रूप में प्राथमिक कुंजी LinQ पर मूल्य है।

Case newCase = new Case(...); 
dbContext.Entry(newCase).State = EntityState.Modified; 
dbContext.SaveChanges(); 

अपनी ऑब्जेक्ट की जांच करें, क्या यह प्राथमिक कुंजी Null पास करता है। यह अपवाद आम तौर पर केवल इसी कारण से है।

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