2010-12-03 15 views
7

मैंने निम्न कोशिश की:एक गोल यात्रा के बिना एक इकाई को अद्यतन करने के लिए कैसे? (ईएफ 4)

public void UpdatePlayer(int id) 
{ 
    Player player = new Player() {ID = id}; 
    player.Password = "12"; 
    Entities.Players.Attach(player); 
    Entities.SaveChanges(); 
} 

डीबी में कोई बदलाव नहीं।
मुझे क्या याद आ रही है?

उत्तर

12

मुझे लगता है कि ऐसा हो सकता है क्योंकि आप ऑब्जेक्ट संलग्न करने से पहले मान सेट कर रहे हैं - डेटा संदर्भ नहीं जानता कि फ़ील्ड क्या बदल गए हैं। प्रयास करें:

public void UpdatePlayer(int id) 
{ 
    Player player = new Player() {ID = id}; 
    Entities.Players.Attach(player); 
    player.Password = "12"; 
    Entities.SaveChanges(); 
} 
+0

था समस्या :) – Adir

+0

अच्छे पुराने "स्टब इकाई" चाल - एलेक्स की ओर से शुभकामनाएं जेम्स। +1 – RPM1984

3

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

FYI करें Entity Framework 4 - AddObject vs Attach

+0

मुझे संदेह है कि वह एक नया उदाहरण जोड़ने की कोशिश नहीं कर रहा है, अन्यथा वह एक आईडी प्रदान नहीं करेगा ... आदिर? संपादित करें: शीर्षक भी * एक * अद्यतन * अद्यतन करने के लिए है :) –

+0

मुझे नहीं लगता कि आप किसी व्यक्ति के लिए क्वेरी कैसे करते हैं तो – Artemiy

+0

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

1

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

तुम सब करने की ज़रूरत हैको संशोधितEntityState बदलकर एफई के लिए एक संकेत दे रहा है:

Entities.Players.Attach(player);  
Entities.ObjectStateManager.ChangeObjectState(player, EntityState.Modified)  
Entities.SaveChanges(); 
2

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

Entities.Players.Attach(player); 
var objectState = Entities.ObjectStateManager.GetObjectStateEntry(player); 
objectState.SetModifiedProperty("Password"); 
Entities.SaveChanges(); 

तुम भी इकाई संलग्न के बाद पासवर्ड सेट करने की कोशिश कर सकते हैं:

Entities.Players.Attach(player); 
player.Password = "12"; 
Entities.SaveChanges(); 
संबंधित मुद्दे