एंटिटी फ्रेमवर्क: "स्टोर अपडेट, इंसर्ट या डिलीट स्टेटमेंट ने अप्रत्याशित संख्या में पंक्तियों को प्रभावित किया (0)।" [बन्द है]


324

ग्रिड कंट्रोल को पॉप्युलेट करने के लिए मैं एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं। कभी-कभी जब मैं अपडेट करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

अनपेक्षित संख्या पंक्तियों (0) को प्रभावित करते हुए स्टोर अपडेट, इंसर्ट या डिलीट स्टेटमेंट। संस्थाओं को लोड किए जाने के बाद से एंटिटीज़ को संशोधित या नष्ट किया जा सकता है। ताज़ा करें ObjectStateManager प्रविष्टियाँ।

मैं यह पता नहीं लगा सकता कि यह कैसे पुन: पेश किया जाए। लेकिन इसके साथ कुछ करना हो सकता है कि मैं अपडेट कैसे पास करूं। क्या किसी ने यह देखा है या किसी को पता है कि त्रुटि संदेश क्या दर्शाता है?

संपादित करें: दुर्भाग्य से मैं अब यहां होने वाली समस्या को पुन: उत्पन्न करने के लिए स्वतंत्रता में नहीं हूं, क्योंकि मैं इस परियोजना से दूर चला गया था और याद नहीं है कि क्या मुझे अंततः एक समाधान मिला है, अगर कोई अन्य डेवलपर इसे तय करता है, या यदि मैंने इसके चारों ओर काम किया है। इसलिए मैं कोई जवाब स्वीकार नहीं कर सकता।


मुझे यह त्रुटि एक SQL सर्वर पंक्ति स्तर सुरक्षा नीति की शुरूआत के साथ मिली जिसने एक पंक्ति में एक अद्यतन के लिए अनुमति दी थी जिसे वापस नहीं पढ़ा जा सकता है (एक विशेष फिल्टर एक विधेय ब्लॉक विधेय के साथ समर्पित है) । EntityFramework को अपडेट के बाद अपडेट की गई पंक्ति को वापस पढ़ने की आवश्यकता होती है अन्यथा यह मान लेता है कि यह एक संगामिति त्रुटि थी (कम से कम आशावादी संगोष्ठी का उपयोग करते समय)।
xr280xr

समस्या आपके DBContext stackoverflow.com/questions/49154250/… (यह उदाहरण ASPNET आइडेंटिटी के लिए है लेकिन किसी भी संदर्भ के लिए लागू होती है) के लिए गलत तरीके से स्कोपिंग हो सकती है
Simon_Weaver

इस त्रुटि के संदर्भ के बावजूद, यह एक अच्छा विचार है कि जहां भी यह है कि संदर्भ को तात्कालिक रूप दिया जा रहा है, एक ब्रेकपॉइंट लगाएं। क्या आप यह उम्मीद कर रहे थे कि जब आप एक वेबपेज को लोड करेंगे तो यह तुरंत हो जाएगा लेकिन यह उस ब्रेकपॉइंट को 5 बार मार रहा है? तब आप शायद एक दौड़ की स्थिति है। को देखो Request.Uriवास्तविक अनुरोध URL को देखने के लिए। मेरे मामले में मेरे पास कुछ ट्रैकिंग तर्क थे जो मेरी साइट को मार रहे थे और अनावश्यक रूप से डीबी से संदर्भ लोड कर रहे थे (और कभी-कभी इसे अपडेट भी करते थे)। तो फिर मैं जिस वास्तविक पेज पर डिबगिंग कर रहा था, उसका डेटा स्टूपिड ट्रैकिंग कोड लॉजिक द्वारा स्टॉप्ड था।
साइमन_वेर

add @ Html.AntiForgeryToken () देखने में
विकास शर्मा

जवाबों:


199

यह एक सुविधा का साइड-इफ़ेक्ट है जिसे आशावादी संक्षिप्तता कहा जाता है।

100% निश्चित नहीं है कि एंटिटी फ्रेमवर्क में इसे चालू / बंद कैसे किया जाए, लेकिन मूल रूप से यह जो आपको बता रहा है वह यह है कि जब आपने डेटाबेस से डेटा को पकड़ा था और जब आपने अपने परिवर्तनों को सहेज लिया था तो किसी और ने डेटा बदल दिया है (जिसका मतलब था कि आप कब गए थे इसे बचाने के लिए 0 पंक्तियों को वास्तव में अपडेट किया गया)। SQL शब्दों में, उनके updateक्वेरी के whereक्लॉज़ में पंक्ति में प्रत्येक फ़ील्ड का मूल मान होता है, और यदि 0 पंक्तियाँ प्रभावित होती हैं, तो यह पता चलता है कि कुछ गलत हो गया है।

इसके पीछे विचार यह है कि आप एक परिवर्तन को समाप्त नहीं करेंगे जो आपके एप्लिकेशन को नहीं पता था कि यह हुआ है - यह मूल रूप से आपके सभी अपडेट पर .NET द्वारा फेंका गया एक छोटा सा सुरक्षा उपाय है।

यदि यह सुसंगत है, तो यह आपके ही तर्क के भीतर हो रहा है (ईजी: आप वास्तव में चयन और अपडेट के बीच डेटा को अन्य विधि में स्वयं अपडेट कर रहे हैं), लेकिन यह केवल दो अनुप्रयोगों के बीच एक दौड़ की स्थिति हो सकती है।


34
यह एकल-उपयोगकर्ता वातावरण (मेरी देव मशीन पर) में हो रहा है, इसलिए मुझे नहीं लगता कि यह एक दौड़ की स्थिति हो सकती है। मैं एक EntityDataSource के साथ एक कस्टम ग्रिड नियंत्रण के लिए बाध्य हूं इसलिए मुझे यकीन नहीं है कि वास्तव में पर्दे के पीछे क्या हो रहा है, लेकिन मेरे पास कोई अतिरिक्त कोड नहीं है जो तालिकाओं को संशोधित कर रहा है। क्या इस संगामिति सेटिंग को बदलने का कोई तरीका है?
गढ़ों का समय

3
मुझे लगता है कि आप अपने इकाई मॉडल (यह गुण विंडो में) में प्रति-स्तंभ के आधार पर कर सकते हैं, लेकिन बात यह है कि मैं आपको त्रुटि देखने से रोकूंगा और यह अभी भी कुछ भी अपडेट नहीं करेगा। क्या आप SQL कमांड को अपने डेटाबेस पर जा सकते हैं (जैसे: MSSQL के लिए SQL सर्वर प्रोफाइलर)? इस तरह आप देख सकते हैं कि यह किस अद्यतन को उत्पन्न करता है और यह देखने में सक्षम होना चाहिए कि यह अद्यतन किसी भी पंक्तियों को प्रभावित क्यों नहीं करता है।
fyjham

9
यदि इकाई के पास एक टाइमस्टैम्प संपत्ति है, तो सुनिश्चित करें कि आपने इसे अपने दृश्य में संग्रहीत किया है और सुनिश्चित करें कि इकाई टाइमस्टैम्प को ठीक से आबाद करे।
AIBMer

मेरे पास टाइमस्टैम्प कॉलम था और एक बार जब मैंने इसे संबोधित किया, EF6.1 ने उम्मीद के मुताबिक काम किया, टिप के लिए धन्यवाद @anelBMer
JQII

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

394

मैं इसमें भाग गया और यह इकाई की आईडी (कुंजी) फ़ील्ड सेट नहीं होने के कारण हुआ। इस प्रकार जब संदर्भ डेटा को बचाने के लिए गया, तो उसे आईडी नहीं मिल पाई। 0. अपने अपडेट स्टेटमेंट में एक ब्रेक प्वाइंट रखना सुनिश्चित करें और सत्यापित करें कि इकाई का आईडी सेट हो गया है।

पॉल बेलोरा की टिप्पणी से

मेरे पास यह सटीक समस्या थी, जो कि .cshtml एडिट पेज में छिपे आईडी इनपुट को शामिल करने की भूल के कारण हुई


3
+1 मुझे वही समस्या हो रही थी और इससे समाधान खोजने में मदद मिली। मेरे आदेश मॉडल में मेरे पास [Bind (बहिष्करण = "ऑर्डरआईडी")] था, जो इकाई के आईडी के मूल्य को HttpPost पर शून्य होने का कारण बना रहा था।
ड्राफ्ट करें

2
बस यही मुझे याद आ रहा था। मेरी वस्तु का आईडी 0. था
अज़हर खोरासानी

4
@ Html.HiddenFor (मॉडल => model.productID) - एकदम सही काम किया। मुझे EDIT PAGE (MVC RAZOR)
रवि राम

2
मेरे पास एक समान मुद्दा था लेकिन एक मोड़ के साथ। मेरे लिए यह मुद्दा था कि मेरे पास sql टेबल सेटअप सही ढंग से नहीं था। मेरा प्राथमिक कुंजी फ़ील्ड ऑटो वेतन वृद्धि के लिए सेट नहीं किया गया था। तो ईएफ रिकॉर्ड भेज देगा मैं w / oa कुंजी सम्मिलित करने की कोशिश कर रहा था जो कि ठीक है अगर आपको याद है कि sql उस क्षेत्र को एक ऑटो वेतन वृद्धि पहचान क्षेत्र है, जिसे मैं भूल गया था: <
एजाइल नोब

1
एक ही मुद्दा है, लेकिन एक समग्र कुंजी का उपयोग कर। मुख्य मानों में से एक सेट नहीं किया गया था।
obaylis

113

वाह, बहुत सारे उत्तर, लेकिन मुझे यह त्रुटि तब मिली जब मैंने कुछ अलग किया जो किसी और ने उल्लेख नहीं किया है।

लंबी कहानी छोटी, यदि आप एक नई वस्तु बनाते हैं और ईएफ को बताते हैं कि इसका संशोधित उपयोग करके EntityState.Modifiedयह त्रुटि को फेंक देगा क्योंकि यह अभी तक डेटाबेस में मौजूद नहीं है। यहाँ मेरा कोड है:

MyObject foo = new MyObject()
{
    someAttribute = someValue
};

context.Entry(foo).State = EntityState.Modified;
context.SaveChanges();

जी हाँ, यह बहुत ही कठिन लग रहा है, लेकिन यह इसलिए सामने आया क्योंकि जिस पद्धति का इस्तेमाल किया fooगया था, वह पहले इस पर बनी हुई थी, अब यह केवल इसे someValueपारित कर दिया गया है और इसे fooस्वयं बनाती है।

आसान फिक्स, बस पूरी लाइन को बदल EntityState.Modifiedदें EntityState.Addedया बदल दें:

context.MyObject.Add(foo);

इसे पोस्ट करने के लिए धन्यवाद। यह मेरी समस्या भी थी, मैंने कुछ कोड को कॉपी-पेस्ट किया था जो स्टेट को EntityState.odified पर सेट कर रहा था।
क्लेरी

23

मैं इस समान डराने वाली त्रुटि का सामना कर रहा था ... :) तब मुझे महसूस हुआ कि मैं एक सेट करना भूल गया था

@Html.HiddenFor(model => model.UserProfile.UserId)

अद्यतन की जा रही वस्तु की प्राथमिक कुंजी के लिए! मैं इस सरल, लेकिन बहुत महत्वपूर्ण बात को भूल जाते हैं!

वैसे: HiddenForASP.NET MVC के लिए है।


3
यह एक सुरक्षा दोष की तरह लगता है, UserIdफॉर्म को स्टोर करने के लिए, हैकर्स के लिए बहुत खतरा है ... इसके बाद से आबादी होनी चाहिएHttpContext.Current.User.Identity.Name
सर्ज सागर

@SerjSagan आप सही कह रहे हैं ... लेकिन जब तक आप UserId और वर्तमान UserName की पुष्टि करने के लिए सर्वर की ओर से कुछ जाँच करते हैं, आप जाने के लिए अच्छे हैं।
लेनियल मैककैफेर्री

1
मेरी बात यह है कि यहां तक ​​कि स्टोर करें कि HiddenForआपको इसे HttpContextवैसे भी प्राप्त करने की आवश्यकता होगी ... मैं इस संपत्ति को फॉर्म में बिल्कुल भी नहीं डालूंगा, जो मुझे हमेशा सर्वर साइड को आबाद करने के लिए मजबूर करेगा ...
सर्ज सागन

16

जांचें कि क्या आप "DataKeyNames" विशेषता को GridView में भूल गए हैं। यह एक जरूरी है जब ग्रिड के भीतर डेटा को संशोधित किया जाए

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx


+1। मेरे लिए बिल्कुल सही और सरल उपाय। मैं GridView को EntityDataSource के लिए बाध्य कर रहा हूं और इसे ऑब्जेक्ट पर मेरी प्राथमिक कुंजी पर सेट नहीं किया है।
एंडिज

हम जानते हैं कि केंडो यूआई समग्र कुंजी का समर्थन नहीं करता है, लेकिन मामले में मैंने नया कॉलम जोड़ा है जो मेरी कुंजी को एक में एड करता है, फिर क्या हो रहा है?
21:39

15

मुद्दा दो चीजों में से एक के कारण होता है: -

  1. आपने एक या अधिक प्रॉपर्टी वाली पंक्ति को अपडेट करने का प्रयास किया है Concurrency Mode: Fixed.. और ऑप्टिमिस्टिक कॉनएरेबिलिटी ने डेटा को सहेजने से रोका। अर्थात। जब आप सर्वर डेटा प्राप्त करते हैं और जब आप अपना सर्वर डेटा बचाते हैं, तो बीच में से कुछ ने पंक्ति डेटा को बदल दिया।
  2. आपने किसी पंक्ति को अपडेट या हटाने का प्रयास किया लेकिन पंक्ति मौजूद नहीं है। किसी को फिर से सहेजने के बीच में डेटा (इस मामले में, हटाते हुए) को बदलने का एक और उदाहरण है कि आप हमारे क्षेत्र को अपडेट करने की कोशिश कर रहे हैं जो पहचान नहीं है (यानी। StoreGeneratedPattern = Computed) और वह पंक्ति मौजूद नहीं है।

1
यह भी कारण हो सकता है यदि सभी ऑब्जेक्ट गुण जिन्हें असाइन किया गया था, उन्हें उसी मानों के साथ असाइन किया गया था जो पहले था।
सर्ज सागर

दूसरे के लिए +1। मेरे पास StoreGeneratedPattern = कोई नहीं था, StoreGeneratedPattern में बदलकर = पहचान ने समस्या का समाधान किया। धन्यवाद
tkt986

12

मुझे यह त्रुटि मिली क्योंकि पीके का हिस्सा एक डेटाइम कॉलम था, और उस कॉलम के मूल्य के रूप में दिनांक समय-समय पर उपयोग किए जा रहे रिकॉर्ड को दर्ज किया गया था। इकाई ढाँचा मिलीसेकंड परिशुद्धता के साथ मान सम्मिलित करेगा, और उसके बाद यह मूल्य केवल मिलीसेकंड परिशुद्धता के साथ सम्मिलित करें। हालांकि SqlServer ने मूल्य को दूसरी परिशुद्धता के लिए गोल कर दिया था, और इस प्रकार इकाई रूपरेखा मिलीसेकंड सटीक मूल्य को खोजने में असमर्थ थी।

समाधान डालने से पहले DateTime.Now से मिलीसेकंड को छोटा करना था।


2
हम एक ही समस्या को छोड़कर Dateएक DateTimeमान के साथ एक कॉलम में डाल रहे थे
adam0101

1
मुझे भी। हमारे पास डेटा वेयरहाउस रिकॉर्ड था और कुंजी के भाग के रूप में टाइमस्टैम्प का उपयोग कर रहे थे। डेटा वेयरहाउस में टाइमस्टैम्प SQL डेटाइम था, लेकिन C # में टाइमस्टैम्प मेल नहीं खा रहा था। मैंने SQL डेटा प्रकार को DateTime2 (7) में बदल दिया, EF मॉडल को अपडेट किया, और सब ठीक किया गया।
21

डेटाटाइम 2 (7) के लिए कॉलम बदलना मेरे लिए भी काम कर गया। थैंक्स @mmcfly
Dzejms

10

मुझे एक ही समस्या और @ webtrifusion का जवाब मिल रहा था ने इसका हल ढूंढने में मदद की।

मेरा मॉडल Bind(Exclude)इकाई की आईडी पर विशेषता का उपयोग कर रहा था, जिससे HttpPost पर इकाई की आईडी का मूल्य शून्य हो गया था।

namespace OrderUp.Models
{
[Bind(Exclude = "OrderID")]
public class Order
{
    [ScaffoldColumn(false)]
    public int OrderID { get; set; }

    [ScaffoldColumn(false)]
    public System.DateTime OrderDate { get; set; }

    [Required(ErrorMessage = "Name is required")]
    public string Username { get; set; }
    }
}   

इसी तरह की समस्या, सुरक्षा कारणों से, मेरे पास बिंद है (कुछ क्षेत्रों को शामिल करें)। आईडी सूची में नहीं थी। इसके अलावा मैंने इसे एक छिपे हुए इनपुट के रूप में जोड़ा। MVC द्वारा उत्पन्न कुछ मिटा दिया जाना चाहिए या आईडी वहाँ नहीं था। सहायता के लिए धन्यवाद।
MusicAndCode

10

मुझे एक ही समस्या थी, मैं यह पता लगाता हूं कि रोववर्सन जो कि अशक्त था। जाँच करें कि आपके ईद और अपने RowVersion हैं रिक्त नहीं

अधिक जानकारी के लिए इस ट्यूटोरियल को देखें

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application


पंक्ति संस्करण मेरे मामले में अशक्त था
प्रकाश

मेरे मामले में मैंने गलती से अपने [बिंद (गुण शामिल करें)] में ईद क्षेत्र को हटा दिया था। इसे वापस जोड़ें और यह ठीक काम किया।
कावरमैन

8

मॉडल-प्रथम से कोड-प्रथम में बदलने के बाद मुझे यह त्रुटि मिलनी शुरू हुई। मेरे पास एक डेटाबेस को अपडेट करने के लिए कई थ्रेड हैं जहां कुछ एक ही पंक्ति को अपडेट कर सकते हैं। मुझे नहीं पता कि मुझे मॉडल-प्रथम का उपयोग करने में कोई समस्या क्यों नहीं हुई, मान लें कि यह एक अलग संगामिति डिफ़ॉल्ट का उपयोग करता है।

जिन स्थितियों में यह हो सकता है, उन स्थितियों को जानने के लिए इसे एक स्थान पर संभालना, मैंने अपने DbContext वर्ग में निम्न अधिभार को जोड़ा:

using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;

public class MyDbContext: DbContext {
...
        public int SaveChanges(bool refreshOnConcurrencyException, RefreshMode refreshMode = RefreshMode.ClientWins) {
            try {
                return SaveChanges();
            }
            catch (DbUpdateConcurrencyException ex) {
                foreach (DbEntityEntry entry in ex.Entries) {
                    if (refreshMode == RefreshMode.ClientWins)
                        entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                    else
                        entry.Reload();
                }
                return SaveChanges();
            }
        }
}

फिर SaveChanges(true)जहां भी लागू हो, बुला लिया ।


1
ठीक है, बाकी सभी इस मुद्दे के बारे में शिकायत कर रहे हैं, यह दिखाते हैं कि वे इसे कैसे ट्रिगर कर सकते हैं आदि, लेकिन इस जवाब का एक अच्छा जवाब है। मैं एक जारी अपडेट मॉडल का उपयोग करता हूं (यहां कोई सेव बटन नहीं है बेबी) और ग्रिड अपडेट पर यह मिल रहा था जब ईएफ थ्रेड पीछे गिर रहा था, और इसे हल किया। शानदार काम मेरा अच्छा नाम .. आपने मुझे एक हीरो की तरह बनाया - दिग्गजों के कंधे पर खड़े !!
टोनी ट्रेमबाथ-ड्रेक

मेरी भी मदद की, इसे और
विकल्पों के लिए देखें-

7

आपको प्राथमिक कुंजी के बाउंडफिल्ड को स्पष्ट रूप से शामिल करने की आवश्यकता है। यदि आप उपयोगकर्ता को प्राथमिक कुंजी नहीं देखना चाहते हैं, तो आपको इसे css के माध्यम से छिपाना होगा:

    <asp:BoundField DataField="Id_primary_key" ItemStyle-CssClass="hidden" 
HeaderStyle-CssClass="hidden" />

जहाँ 'छिपा हुआ' सीएसएस में एक वर्ग है, जिसका प्रदर्शन 'कोई नहीं' पर सेट है।


1
हह, आपने मुझे इस तथ्य से चिपकाया कि मैंने ASP.NET MVC में अपनी छिपी आईडी फ़ील्ड को हटा दिया। धन्यवाद @ पाओलो! :)
टोमाज़ इनविविज़

7

संपादन करते समय दृश्य में छिपे क्षेत्र के रूप में इकाई की आईडी या प्राथमिक कुंजी शामिल है

अर्थात

      @Html.HiddenFor(m => m.Id)

यह समस्या हल करता है।

यदि आपके मॉडल में गैर-उपयोग की गई वस्तु शामिल है, तो वह भी और नियंत्रक को पोस्ट करें


7

मुझे भी यह त्रुटि आई। जिस समस्या से यह पता चला है वह उस मेज पर एक ट्रिगर के कारण हुई थी जिसे मैं बचाने की कोशिश कर रहा था। ट्रिगर ने 'INSTEAD OF INSERT' का इस्तेमाल किया जिसका अर्थ है कि उस पंक्ति में कभी भी 0 पंक्तियाँ सम्मिलित नहीं हुईं, इसलिए त्रुटि। सौभाग्य से हो सकता है कि ट्रिगर कार्यक्षमता गलत थी, लेकिन मुझे लगता है कि यह एक वैध ऑपरेशन हो सकता है जिसे किसी तरह कोड में संभाला जाना चाहिए। आशा है कि यह किसी एक दिन मदद करता है।


2
एंटिटी को यह विश्वास दिलाया जा सकता है कि ट्रिगर से सेलेक्ट स्टेटमेंट (प्राथमिक कुंजी कॉलम के साथ) वापस करके पंक्तियों को जोड़ा गया था।
जाहू

1
@ जहू द्वारा टिप्पणी पर विस्तार करने के लिए, मुझे अपने ट्रिगर से वापस आने के लिए नव सम्मिलित आइटम की एक वास्तविक आईडी प्राप्त करनी होगी और कॉलम नाम को ट्रिगर तालिका के पहचान कॉलम (मेरे मामले में, वास्तव में एक दृश्य से मेल खाना चाहिए) 'अपनी खुद की एक पहचान है, लेकिन मैंने edmx को यह मानने में धोखा दिया था)। मेरा ट्रिगर एक अलग टेबल में एक इंसर्ट कर रहा था, इसलिए मैंने अपने ट्रिगर में बस यह आखिरी लाइन जोड़ी:SELECT SCOPE_IDENTITY() as MyViewId
DannyMeister

इस प्रश्न को भी देखें: stackoverflow.com/questions/5820992/…
J. Polfer

मेरे मामले में मैं एक बाल संग्रह में संस्थाओं पर एक डिलीट ऑपरेशन कर रहा था, लेकिन चाइल्ड एंटिटीज में से एक के लिए डिलीट पर एक ट्रिगर था, जिससे एक और चाइल्ड एंटिटीज डिलीट हो गई। एन-1 पंक्तियों के कारण यह त्रुटि हुई, क्योंकि इकाई के ढांचे को हटाने की कोशिश करने से पहले ही चाइल्ड एंटिटीज में से एक को हटाने के कारण ट्रिगर प्रभावित हो गया था।
कंकाल

6

मैं एक मेज पर इस मुद्दे पर आया था जो एक प्राथमिक कुंजी याद कर रहा था और एक DATETIME (2, 3) कॉलम था (इसलिए इकाई की "प्राथमिक कुंजी" सभी स्तंभों का एक संयोजन था) ... सम्मिलित करते समय टाइमस्टैम्प था अधिक सटीक समय (2018-03-20 08: 29: 51.8319154) जो कि (2018-03-20 08: 29: 51.832) से अलग हो गया था, इसलिए प्रमुख क्षेत्रों पर लुकअप विफल हो गया।


5

मेरी भी यह त्रुटि थी। ऐसी कुछ स्थितियाँ हैं जहाँ इकाई वास्तविक डेटाबेस संदर्भ के बारे में नहीं जानते होंगे जो आप उपयोग कर रहे हैं या मॉडल अलग हो सकता है। इसके लिए, सेट करें: EntityState.Modified; को EntityState.Added;

यह करने के लिए:

if (ModelState.IsValid)
{
context.Entry(yourModelReference).State = EntityState.Added;
context.SaveChanges();
}

यह सुनिश्चित करेगा कि इकाई आप के साथ काम कर रहे राज्य को जोड़ने या जोड़ने के बारे में जानता है। इस बिंदु पर सभी सही मॉडल मान सेट करने की आवश्यकता है। पृष्ठभूमि में किए गए किसी भी परिवर्तन को ढीला न करने के लिए सावधानी बरतें।

उम्मीद है की यह मदद करेगा।


1
तुम एक गुरु हो! यह मेरे लिए काम करता है!
हर्नांडो गोंजालेज

5
  @Html.HiddenFor(model => model.RowVersion)

मेरी पंक्तिविहीनता अशक्त थी, इसलिए इसे इस दृश्य के साथ जोड़ना पड़ा जिसने मेरे मुद्दे को हल किया


रो-एक्शन को व्यू से एडिट एक्शन में पास नहीं कर रहा था, साथ ही मैं रोववर्सन के लिए मॉडल बाइंडिंग करना भूल गया। जिस समय आप ऑब्जेक्ट को db में सेव कर रहे हैं, उस समय आपको कॉन्सर्ट की जाँच के लिए ऑब्जेक्ट के साथ RowVersion सबमिट के पिछले मान की आवश्यकता होगी। जब आप चीजों को तेज करते हैं तो आप मूर्खतापूर्ण गलतियां करते हैं!
धानुका Dhan।

5

रेखा [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]ने मेरे मामले में चाल चली:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;


[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? SomeNumber { get; set; }

4

बस सुनिश्चित करें कि तालिका और फ़ॉर्म दोनों में प्राथमिक कुंजी और edmx अपडेट है।

मैंने पाया कि अद्यतन के दौरान कोई भी त्रुटि आमतौर पर इस वजह से थी: - तालिका में कोई प्राथमिक कुंजी नहीं - संपादित दृश्य / प्रपत्र में कोई प्राथमिक कुंजी नहीं (उदाहरण के लिए @Html.HiddenFor(m=>m.Id)


4

मुझे भी यही समस्या थी। मेरे मामले में मैं प्राथमिक कुंजी को अपडेट करने की कोशिश कर रहा था, जिसकी अनुमति नहीं है।


4

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

छिटपुट रूप से त्रुटियां:

[Authorize(Roles = "Admin")]
[HttpDelete]
[Route("file/{id}/{customerId}/")]
public async Task<IHttpActionResult> Delete(int id, int customerId)
{
    var file = new Models.File() { Id = id, CustomerId = customerId };
    db.Files.Attach(file);
    db.Files.Remove(file);

    await db.SaveChangesAsync();

    return Ok();
}

हर समय काम करता है:

[Authorize(Roles = "Admin")]
[HttpDelete]
[Route("file/{id}/{customerId}/")]
public IHttpActionResult Delete(int id, int customerId)
{
    var file = new Models.File() { Id = id, CustomerId = customerId };
    db.Files.Attach(file);
    db.Files.Remove(file);

    db.SaveChanges();

    return Ok();
}

हालाँकि इसने मेरी समस्या को हल कर दिया, लेकिन इसने इस मुद्दे को पीके और रो संस्करणों के बारे में पहले बताए गए अंतर्निहित मुद्दे की ओर इशारा किया। मैंने एक नई तालिका के लिए एक स्कीमा मानचित्र जोड़ने की उपेक्षा की थी जो इस तथ्य से और अधिक जटिल थी कि पीके ने नामकरण नियम का पालन नहीं किया था। <तालिका का नाम> आईडी।
मिडोहिबोआडर

3

मुझे वह त्रुटि तब मिली जब मैं DB (लूप में) में कुछ पंक्तियों को हटा रहा था, और नए लोगों को एक ही तालिका में जोड़ रहा था।

मेरे लिए समाधान, प्रत्येक लूप पुनरावृत्ति में एक नया संदर्भ बनाने के लिए था


मुझे एक ही काम करना था, फिर भी यह निश्चित नहीं था कि समस्या पहले स्थान पर क्यों हुई, लेकिन यह काम करता है।
जैड ग्रांट

3
    public void Save(object entity)
    {
        using (var transaction = Connection.BeginTransaction())
        {
        try
                {
                    SaveChanges();
                    transaction.Commit();
                }
                catch (OptimisticConcurrencyException)
                {
                    if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                        this.Refresh(RefreshMode.StoreWins, entity);
                    else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                        Detach(entity);
                    AcceptAllChanges(); 
                    transaction.Commit();
                }
        }
    }

क्या आप कृपया स्पष्ट कर सकते हैं कि 'यह' यहाँ क्या है और ObjectStateManager क्या है? मैं अपने बेस रिपॉजिटरी वर्ग में यह कोशिश कर रहा हूं, लेकिन त्रुटि हो रही है
नाओमी

3

यह तब भी होगा जब आप एक अद्वितीय बाधा स्थिति में डालने का प्रयास कर रहे हैं, अर्थात यदि आप प्रति नियोक्ता के लिए केवल एक प्रकार का पता रख सकते हैं और आप उसी नियोक्ता के साथ उसी प्रकार का एक दूसरा सम्मिलित करने का प्रयास करते हैं, तो आपको वही समस्या मिलेगी ।

या

ऐसा तब भी हो सकता है जब सभी ऑब्जेक्ट गुण जिन्हें असाइन किया गया था, उन्हें उसी मानों के साथ असाइन किया गया था जो पहले था।

        using(var db = new MyContext())
        {
            var address = db.Addresses.FirstOrDefault(x => x.Id == Id);

            address.StreetAddress = StreetAddress; // if you are assigning   
            address.City = City;                   // all of the same values
            address.State = State;                 // as they are
            address.ZipCode = ZipCode;             // in the database    

            db.SaveChanges();           // Then this will throw that exception
        }

2

यदि आप अपने edmx फ़ाइल में "फ़ंक्शन आयात" के लिए मैपिंग बनाने का प्रयास कर रहे हैं, तो यह त्रुटि हो सकती है। अपने edmx में दिए गए निकाय के लिए मैपिंग विवरण में स्थित डालने, अद्यतन करने और हटाने के लिए बस फ़ील्ड साफ़ करें, और यह काम करना चाहिए। मुझे उम्मीद है कि मैंने इसे स्पष्ट कर दिया है।


2

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

context.Users.Attach(orderer);

साथ में

if (orderer.Id > 0) {
    context.Users.Attach(orderer);
}

2

वैसे मेरा भी यही मुद्दा है। लेकिन यह मेरी अपनी गलती के कारण था। वास्तव में मैं इसे जोड़ने के बजाय किसी ऑब्जेक्ट को सहेज रहा था। तो यह संघर्ष था।


2

Sql सर्वर वातावरण में इस समस्या को डीबग करने का एक तरीका SqlServer की अपनी प्रतिलिपि के साथ शामिल Sql Profiler का उपयोग करना है, या यदि एक्सप्रेस संस्करण का उपयोग करके नीचे दिए गए लिंक द्वारा CodePlex से मुक्त करने के लिए Express Profiler की एक प्रतिलिपि प्राप्त करें:

एक्सप्रेस प्रोफाइलर

Sql Profiler का उपयोग करके आप EF द्वारा DB को जो भी भेजा जा रहा है, उस तक पहुँच प्राप्त कर सकते हैं। मेरे मामले में यह राशि:

exec sp_executesql N'UPDATE [dbo].[Category]
SET [ParentID] = @0, [1048] = NULL, [1033] = @1, [MemberID] = @2, [AddedOn] = @3
WHERE ([CategoryID] = @4)
',N'@0 uniqueidentifier,@1 nvarchar(50),@2 uniqueidentifier,@3 datetime2(7),@4 uniqueidentifier',
@0='E060F2CA-433A-46A7-86BD-80CD165F5023',@1=N'I-Like-Noodles-Do-You',@2='EEDF2C83-2123-4B1C-BF8D-BE2D2FA26D09',
@3='2014-01-29 15:30:27.0435565',@4='3410FD1E-1C76-4D71-B08E-73849838F778'
go

मैंने इसे Sql Server में क्वेरी विंडो में कॉपी किया और इसे निष्पादित किया। निश्चित रूप से पर्याप्त है, हालांकि यह चला, इस क्वेरी से 0 रिकॉर्ड प्रभावित हुए थे इसलिए त्रुटि ईएफ द्वारा वापस किया जा रहा है।

मेरे मामले में समस्या का कारण कैडिड था।

डेटाबेस को भेजी गई आईडी ईएफ द्वारा किसी भी श्रेणी की पहचान नहीं की गई थी, इसलिए 0 रिकॉर्ड प्रभावित हो रहा है।

यह ईएफ की गलती नहीं थी, बल्कि एक छोटी सी अशक्त सहूलियत थी "??" एक दृश्य नियंत्रक में बयान जो डेटा टियर को बकवास भेज रहा था।


2

उपर्युक्त उत्तरों में से किसी ने भी मेरी स्थिति और इसके समाधान को कवर नहीं किया है।

कोड जहां MVC5 नियंत्रक में त्रुटि डाली गई थी:

        if (ModelState.IsValid)
        {
            db.Entry(object).State = EntityState.Modified; 
            db.SaveChanges(); // line that threw exception
            return RedirectToAction("Index");
        }

मुझे यह अपवाद तब मिला जब मैं किसी वस्तु को एक संपादन दृश्य से बचा रहा था। इसे फेंकने का कारण यह था क्योंकि जब मैं इसे बचाने के लिए वापस गया था, तो मैंने उन गुणों को संशोधित किया था जो ऑब्जेक्ट पर प्राथमिक कुंजी का गठन करते थे। इस प्रकार, अपने राज्य को संशोधित करने के लिए ईएफ के लिए कोई मतलब नहीं था - यह एक नई प्रविष्टि थी, पहले से सहेजा नहीं गया था।

आप इसे ए द्वारा हल कर सकते हैं) ऑब्जेक्ट को जोड़ने के लिए सेव कॉल को संशोधित कर सकते हैं, या बी) बस एडिट पर प्राथमिक कुंजी नहीं बदल सकते। मैंने बी) किया।


2

जब स्वीकृत उत्तर में कहा गया कि " यह एक बदलाव को समाप्त नहीं करेगा, जो कि आपके आवेदन को नहीं पता था कि हुआ है ", मुझे संदेह था क्योंकि मेरी वस्तु नव निर्मित थी। लेकिन फिर यह पता चला, वहाँ एक थाINSTEAD OF UPDATE, INSERT- TRIGGER तालिका संलग्न था जो उसी तालिका के परिकलित स्तंभ को अद्यतन कर रहा था।

एक बार जब मैंने AFTER INSERT, UPDATEइसे बदल दिया , तो यह ठीक काम कर रहा था।


2

डेटाइम और डेटाटाइम 2 के बीच एक बेमेल संबंध के कारण मेरे साथ ऐसा हुआ। अजीब बात है, यह एक परीक्षक से पहले ठीक काम करता था इस मुद्दे की खोज। माई कोड फर्स्ट मॉडल में प्राथमिक कुंजी के हिस्से के रूप में एक डेटटाइम शामिल था:

[Key, Column(Order = 2)]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

उत्पन्न कॉलम एक डेटाइम कॉलम है। SaveChanges को कॉल करते समय, EF ने निम्न SQL उत्पन्न किया:

-- Region Parameters
DECLARE @0 Int = 2
DECLARE @1 Int = 25
DECLARE @2 Int = 141051
DECLARE @3 DateTime2 = '2017-07-27 15:16:09.2630000' --(will not equal a datetime value)
-- EndRegion
UPDATE [dbo].[OrganizationSurvey]
SET [OrganizationSurveyStatusId] = @0
WHERE ((([SurveyID] = @1) AND ([OrganizationID] = @2)) AND ([PurchasedDate] = @3))

चूँकि यह डेटाइम 2 मान के साथ एक डेटाइम कॉलम से मेल करने की कोशिश कर रहा था, इसने कोई परिणाम नहीं दिया। एकमात्र उपाय जो मैं सोच सकता था कि कॉलम को डेटाइम 2 में बदलना था:

[Key, Column(Order = 2, TypeName = "DateTime2")]  
public DateTime PurchasedDate { get; set; } = (DateTime)SqlDateTime.MinValue;

1
यह बनाम काम कर काम नहीं कर की विचित्रता के अंतर्निहित प्रारूप / आधार के साथ क्या करना है datetimeबनाम datetime2। अनिवार्य रूप से कुछ मिलीसेकंड मान एक मैच का मूल्यांकन करेंगे, अन्य नहीं करेंगे। मेरे साथ भी यही हुआ और मैंने भी स्विच किया DateTime2
xr280xr

मैं चाहता हूं कि मैं आपके लिए इस पर +100 कर सकूं। मैंने कई जगहों के आसपास जाने के बाद आखिरकार मुझे यह पता चला और महसूस किया कि, वास्तव में, मेरी प्राथमिक कुंजी के हिस्से के रूप में मेरे पास एक डेटटाइम था। हां, यह वास्तव में इसे तय करता है। मैंने डेटाटाइम 2 को कॉलम अपडेट किया और इसने काम किया। अब, मेरा गोमांस इस तरह के एक भद्दे प्रश्न को तैयार करने के लिए एंटिटी फ्रेमवर्क के साथ है जो मुझे ऐसा करने के लिए मजबूर करता है।
कैचअप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.