2011-01-12 4 views
7

मेरे पास 2 परियोजनाएं हैं - एक कक्षा पुस्तकालय जिसमें ईडीएम इकाई फ्रेमवर्क मॉडल और एक अलग एएसपी.नेट एमवीसी परियोजना है।एएसपी.नेट एमवीसी 3 में ईएफ 4 इकाई को कैसे अपडेट करें?

मुझे एमवीसी का उपयोग करके किसी इकाई में परिवर्तनों को संपादित करने और सहेजने के तरीके के साथ समस्याएं आ रही हैं। मेरी नियंत्रक में मेरे पास है:

public class UserController : Controller 
    { 
     public ActionResult Edit(int id) 
     { 
      var rep = new UserRepository(); 

      var user = rep.GetById(id); 

      return View(user); 
     } 

     [HttpPost] 
     public ActionResult Edit(User user) 
     { 
      var rep = new UserRepository(); 

      rep.Update(user); 

      return View(user); 
     } 
    } 

मेरे UserRepository इस तरह की एक अद्यतन विधि है:

public void Update(User user) 
{ 
    using (var context = new PDS_FMPEntities()) 
    { 
     context.Users.Attach(testUser); 
     context.ObjectStateManager.ChangeObjectState(testUser, EntityState.Modified); 
     context.SaveChanges(); 
    } 
} 

अब, जब मैं 'सहेजें' संपादित करें उपयोगकर्ता पेज पर क्लिक करें, पैरामीटर user केवल दो मान हैं आबादी: आईडी, और फर्स्टनाम। मैं इसे लेता हूं जो इस तथ्य के कारण है कि मैं केवल उन दो गुणों को देख रहा हूं।

मेरा प्रश्न यह है कि, यदि मैं उपयोगकर्ता का पहला नाम अपडेट कर रहा हूं, और फिर इसे सहेजना चाहता हूं, तो मुझे अन्य User गुणों के बारे में क्या करना है, जो दृश्य पर नहीं दिखाए गए थे, क्योंकि अब उनमें 0 या user ऑब्जेक्ट में कुल मान?

मैं स्टब इकाइयों का उपयोग करने के बारे में बहुत कुछ पढ़ रहा हूं, लेकिन मुझे कहीं भी तेज़ नहीं मिल रहा है, जिसमें मैंने वास्तव में कोई भी उदाहरण नहीं देखा है। यानी मैं EntityKey संबंधित अपवाद प्राप्त करता रहता हूं।

क्या कोई मुझे एक अच्छा ट्यूटोरियल/उदाहरण के लिए इंगित कर सकता है कि एक एमवीसी फ्रंट एंड द्वारा बुलाए गए रिपोजिटरी क्लास का उपयोग करके ईएफ 4 इकाइयों को कैसे अपडेट किया जाए?

उत्तर

1

ठीक है, कुछ परीक्षण और त्रुटि के बाद, मुझे एक समाधान मिल गया है।

public void Update(User user) 
{ 
    using (this.Context) 
    { 
     var tempUser = new User { usr_id = user.usr_id }; 

     this.Context.Users.Attach(tempUser); 
     this.Context.ApplyCurrentValues("Users", user); 
     this.Context.SaveChanges(); 
    } 
} 

अन्य उदाहरण मैंने कोशिश की बहुत ऊपर के करीब थे, लेकिन में से कुछ सिर्फ निशान याद किया: यहाँ UserRepository में मेरे अद्यतन Update तरीका है।

+2

@Jason इवांस - कि ठूंठ तकनीक के रूप में जाना जाता है, और केवल अदिश संपत्तियों के लिए काम करता है। यदि आपके पास 'उपयोगकर्ता। एड्रेस' जैसी नौसैनिक संपत्ति है, जिसे आप अपने व्यू में बाध्यकारी कर रहे हैं, तो उपरोक्त पते को अपडेट नहीं करेंगे। मैं आपको ऑब्जेक्ट को अपडेट करने के लिए 'TryUpdateModel' का उपयोग करके फिर से डीबी से उपयोगकर्ता को पुनर्प्राप्त करने की सलाह दूंगा। अधिक जानकारी के लिए यहां मेरा हालिया प्रश्न/उत्तर देखें: http://stackoverflow.com/questions/4653834/asp-net-mvc-ef4-poco-repository-how-to-update-relationships/4666466#4666466 – RPM1984

+0

@ RPM1984 - यह नेविगेशन गुणों के साथ परेशानी बचाएगा। TryUpdateModel() के साथ मेरे पास एक चिंता है। मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि सामानों को प्राप्त/सहेजने/हटाने से निपटने के लिए मैं एक भंडार का उपयोग कर सकता हूं। TryUpdateModel() का उपयोग करके, क्या आपके पास यह कोड कैसे करें इस पर अच्छे डिज़ाइन के सुझाव हैं? मैं नहीं चाहता कि नियंत्रक किसी भी डेटाबेस से संबंधित कोड से निपटने के लिए यदि आप देखते हैं कि मेरा क्या मतलब है। –

+0

नहीं, सुनिश्चित नहीं है कि आपका क्या मतलब है। हालांकि, मैं अनुमान लगाऊंगा कि, अपने रिपोजिटरी में एक मानक "सहेजें" विधि बनाएं, जो "आंकड़े" हो, यदि यह एक नई/मौजूदा वस्तु है (उदाहरण के लिए आईडी पर आधारित)। तो आपको रिपॉजिटरी को कॉल करने की आवश्यकता नहीं है। अद्यतन या भंडार। जोड़ें। बस TryUpdateModel तो सहेजें। यदि आप का जिक्र नहीं है कि आपका कंट्रोलर आपकी इकाई को छू रहा है - मुझे आपकी चिंता नहीं आती है। नियंत्रक मॉडल को रीफ्रेश करने के लिए हैं। और यह सब एक "वस्तु" को अद्यतन कर रहा है - आपका भंडार अभी भी कहा गया वस्तु के दृढ़ता से चिंतित है। – RPM1984

2

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

यदि आप समवर्ती मुद्दों के बारे में चिंतित हैं तो आपको टाइमस्टैम्प को दृश्य में स्टोर करने की आवश्यकता होगी - आमतौर पर एक छिपी हुई फॉर्म मान के रूप में।

0

कृपया निम्नलिखित प्रश्न पर मेरी अद्यतन विधि देखें: Partially updating object with EF Code First and ASP.NET MVC यह अच्छा काम करता है, भले ही मुझे नापसंद हो, मुझे फ़ील्ड नाम निर्दिष्ट करना होगा।

0

मैं asp.net वेबसाइट पर इस ट्यूटोरियल पाया बहुत सहायक हो रहे हैं: Getting Started with EF using MVC - Updating Related Data

पर ध्यान देने की विधि TryUpdateModel जो "मानक" ढंग से संबंधित मॉडल (एक करने के लिए इकाई की स्थापना अपडेट कर देगा संशोधित स्थिति और सब कुछ गुजर रहा है) और फिर आपको कुछ गुणों को अपडेट करने के तरीके को अनुकूलित करने देगा।

मैं इकाई कुंजी के साथ समस्याओं में भाग गया और इससे मुझे उन लोगों को पाने में मदद मिली।

+1

आपके इनपुट के लिए धन्यवाद। मैं इसे ईएफ के संबंध में संसाधनों की सूची में रखूंगा। बहुत सराहना की। –

0

http://forums.asp.net/p/1697685/5032858.aspx/1?Re+MVC3+edits+to+records+using+Entity+Framework+not+saving+to+the+database

ऊपर मुझे लगता है कि एक बहुत ही इसी तरह के मामले (एक समाधान के साथ) है लिंक देखो। शुभकामनाएं

+2

अरे यह बहुत अच्छा होगा अगर आप उस लिंक से एक महत्वपूर्ण अंश भी शामिल कर सकते हैं। –

0

शायद सवाल का जवाब देने में मदद करने में थोड़ा देर हो चुकी है, लेकिन शायद यह किसी और की मदद करेगी।ऐसा लगता है कि आपके पास जो मुख्य समस्या है, वह इस तथ्य के कारण है कि किसी डेटाबेस को संदर्भित करने वाले डेटाबेस संदर्भ उदाहरण को पृष्ठ के बाद डिस्पोजेक्ट किया जाता है। तो जब आप इसे सहेजने का प्रयास करते हैं, तो यह एक संदर्भ का एक नया उदाहरण है, जिसके कारण पिछले संदर्भ कॉल का कोई ज्ञान नहीं है। इसलिए इकाई फ्रेमवर्क को डेटाबेस में सभी पंक्तियों को अद्यतन करना है, क्योंकि इसका कोई तरीका नहीं है कि कौन सी पंक्तियां बदली गईं।

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

आप को लागू बुनियादी CRUD पर ट्यूटोरियल अधिक जानकारी के लिए देख सकते हैं: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application

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