2012-12-31 31 views
6

के लिए संलग्न करें मैं संलग्नक का उपयोग कर ईएफ 5.x का उपयोग कर तालिका के लिए एक अद्यतन करने का प्रयास कर रहा हूं। इस तालिका में अन्य फ़ील्ड हैं जो आवश्यक हैं लेकिन इसकी एक मौजूदा पंक्ति है। तो मैं बिना किसी fetch के अद्यतन करने की कोशिश कर रहा हूँ। उपयोगकर्ता आईडी तालिका के लिए प्राथमिक कुंजी है। मैं स्थिति को अद्यतन करने की कोशिश कर रहा हूं। लेकिन यह एक EntityValidationErrors को फेंकता है कहता है कि पासवर्ड आवश्यक है जो एक और आवश्यक फ़ील्ड है लेकिन प्राथमिक कुंजी नहीं है। चूंकि यह मौजूदा पंक्ति के लिए एक अद्यतन है, इसलिए आपको अद्यतन के लिए रिक्त फ़ील्ड प्रदान करने की आवश्यकता क्यों है?अद्यतन इकाई फ्रेमवर्क

var webUser = new WebUser() { UserId = webUserId, OnlineStatus = (sbyte)status }; 
    using (var dbxupdate = new xEntities()) 
    { 
     try 
     { 
      dbxupdate.WebUsers.Attach(webUser); 
dbxupdate.Entry(webUser).State = EntityState.Modified; 
      dbxupdate.Entry(webUser).Property(x => x.OnlineStatus).IsModified = true; 
      dbxupdate.SaveChanges(); 
     } 
     catch (DbEntityValidationException dbEx) 
     { 
      foreach (var validationErrors in dbEx.EntityValidationErrors) 
      { 
       foreach (var validationError in validationErrors.ValidationErrors) 
       { 
        Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
       } 
      } 
     } 
    } 
+0

पहली पंक्ति पर आप एक नया 'वेब यूज़र' बना रहे हैं और डेटाबेस से किसी को नहीं ला रहे हैं। ब्रेकपॉइंट सेट करने का प्रयास करें और देखें कि 'वेब यूज़र का पासवर्ड' शून्य 'नहीं है या नहीं। – Yoav

+0

मैं डेटा लाने के लिए नहीं चाहता था। चूंकि मैं एक अद्यतन करने जा रहा था और मेरे पास पहले से ही एक प्राथमिक कुंजी –

उत्तर

1

इकाई ढांचे में, आप अन्य फ़ील्ड के लिए उचित मूल्य निर्धारित किए बिना फ़ील्ड अपडेट नहीं कर सकते हैं। इसलिए आपके काम के लिए संग्रहीत प्रक्रिया का उपयोग करना बेहतर है। और दूसरा तरीका रिकॉर्ड लाने और फिर फ़ील्ड को अपडेट करना है।

User entity = null; 

using (var db = new DbContext()) 
{ 
    entity = (from p in db.Users 
       where p.id == 1 
       select p).FirstOrDefault(); 

    System.Diagnostics.Trace.WriteLine(entity.Name); //Outputs "Jane Doe" 
} 

entity.Name = "John Doe" //Modified while no longer connected to database 

using (var db = new DbContext()) 
{ 
    db.Users.Attach(entity); 
    db.Entry(entity).Property(a => a.Name).IsModified = true; 
    db.SaveChanges(); 

    System.Diagnostics.Trace.WriteLine(entity.Name); //Now outputs "John Doe" 
} 

अपने परिदृश्य में इकाई आप बना रहे हैं पुनः प्राप्त किया जा रहा है यह कुंजी है और डेटाबेस के रूप में यह इलाज द्वारा:

+1

आप dbxupdate.Configuration.ValidateOnSaveEnabled = http://stackoverflow.com/a/33121240/2353894 – nhkhanh

+0

गंदे और सबसे अच्छे समाधान में सहेजने पर सत्यापन अक्षम करने के लिए गलत सेट कर सकते हैं। ईएफ का उपयोग कर मौजूदा टेबल को अपडेट करने का प्रयास करते समय आपको बहुत सी समस्याओं का सामना करना पड़ सकता है। – Jacob

2

इकाई को सहेजने पर सत्यापित किया गया है, भले ही यह डेटाबेस से जुड़ा हुआ हो या लोड हो। यदि आप सत्यापन गुण या सत्यापन विधि का उपयोग करते हैं, तो इकाई को सहेजने के लिए सत्यापन पास करना होगा।

यदि आपके पास पासवर्ड क्षेत्र पर [Required] विशेषता है तो मुझे लगता है कि आप काफी अटक गए हैं। आपको शायद इकाई को लोड करना होगा और फिर इसे अटैच करने की बजाय जानकारी अपडेट करनी होगी।

+0

है, मेरे पास उस डेटा विशेषता नहीं है। इसकी डीबी स्तर पर आवश्यक है लेकिन ईएफ पर नहीं, मुझे लगता है कि ADO.net ने डीबी से विशेषता खींची है।मुझे जेनरेट कोड –

+0

पर विशेषता दिखाई नहीं दे रही है ऐसा लगता है कि मुझे ऐसा करने के लिए एक एसपी बनाना है। –

+0

यदि आप पूरी इकाई को लोड किए बिना रिकॉर्ड के केवल एक हिस्से को अपडेट करना चाहते हैं तो एसपी शायद एक अच्छा तरीका है हां। –

0

इस प्रयास करें: के साथ पहली पंक्ति (using बयान के अंदर जगह इस)
var wu = dbxupdate.webUsers.single(i=>i.id== webUserId);
wu.OnlineStatus = whatever;

कोड जारी है की जगह ... एक इकाई आप इसे का एक उदाहरण मिल चाहिए अवगत कराने के लिए। अन्यथा आप एक नया निर्माण कर रहे हैं जहां संपत्ति घोषित नहीं की जाती है null मान प्राप्त करें।

14

.Attach() वास्तव में इस तरह की एक अलग परिदृश्य में संस्थाओं को अद्यतन करने के लिए ही उपयोगी है एक पूरी तरह से नई इकाई। मुझे लगता है कि आपका पासवर्ड एक गैर-शून्य क्षेत्र है और इसलिए जब आप अपने परिवर्तनों को सहेजने का प्रयास करते हैं तो ईएफ एक त्रुटि फेंकता है। यदि आपके पास ऐसी कोई त्रुटि नहीं है तो ईएफ स्वचालित रूप से उन फ़ील्ड को हटा देगा जिन्हें आपने संशोधित नहीं किया था और फिर इकाई को सहेजें (जो परिणाम आप नहीं ढूंढ रहे हैं)।

क्रम परिवर्तन है कि आप तो आप शायद निम्नलिखित की तरह कुछ करना होगा के लिए देख रहे बनाने के लिए:

using (var db = new DbContext()) 
{ 
    db.Users.Single(a => a.id == 1).OnlineStatus = (sbyte)status; 
    db.SaveChanges 
} 

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

foreach (var item in entityList) 
{ 
    var entity = db.Users.Single(a => a.id == item.id); 

    entity.Name = item.Name; 
    entity.Address = item.Address; 
} 

मुझे किसी ने ठीक कर लें मैं गलत हूँ, लेकिन एफई केवल संस्थाओं/क्षेत्रों है कि वास्तव में इस कोड से प्रभावित हैं अद्यतन करना चाहिए। यदि नाम या पता वही रहता है तो ईएफ उस इकाई के लिए उस फ़ील्ड को छोड़ देगा जब यह डेटाबेस में परिवर्तन सहेजता है।