मैं ईएफ 4 का उपयोग कर रहा हूं, स्पॉक्स का उपयोग करके मेरी इकाइयों के लिए सभी सीयूडी संचालन मैपिंग कर रहा हूं।इकाई फ्रेमवर्क 4 एंटिटीस्टेट के साथ इकाई अपरिवर्तित फायरिंग अपडेट
मेरे पास दो टेबल, पता और व्यक्ति हैं। एक व्यक्ति के पास उनके साथ जुड़े कई ADDRESS हो सकते हैं।
यहाँ कोड मैं चला रहा हूँ है:
Person person = (from p in context.People
where p.PersonUID == 1
select p).FirstOrDefault();
Address address = (from a in context.Addresses
where a.AddressUID == 51
select a).FirstOrDefault();
address.AddressLn2 = "Test";
context.SaveChanges();
पता व्यक्ति मैं retrieveing हूँ साथ जुड़ा हुआ है अपडेट किया जा रहा है - हालांकि वे स्पष्ट रूप से कोड में किसी भी तरह से जुड़े हुए नहीं हैं। जब संदर्भ.SaveChanges() निष्पादित करता है न केवल मेरे पता इकाई के लिए अद्यतन स्पोक निकाल दिया जाता है (जैसा कि आप उम्मीद करेंगे), लेकिन व्यक्ति इकाई के लिए अद्यतन स्पोक भी करता है - भले ही आप देख सकें कि इसमें कोई बदलाव नहीं आया है व्यक्ति इकाई
जब मैं संदर्भ से पहले दोनों ऑब्जेक्ट्स की एंटीटीस्टेट की जांच करता हूं। सेव चेंज() कॉल मुझे लगता है कि मेरी पता इकाई में "संशोधित" का एंटिटीस्टेट है और मेरी व्यक्तिगत ईमानदारी में "अपरिवर्तित" का एंटिटीस्टेट है।
व्यक्ति इकाई के लिए अद्यतन स्पोक क्यों कहा जा रहा है? क्या ऐसी कोई सेटिंग है जो मैं इसे रोकने से रोकने के लिए सेट कर सकता हूं?
मैंने यह सुनिश्चित करने के लिए एक दूसरा प्रोजेक्ट बनाया है कि मेरे वर्तमान प्रोजेक्ट वातावरण में कुछ ऐसा नहीं होने के कारण समस्या नहीं हो रही थी।
सबसे पहले, मैंने एक नया डेटाबेस बनाया जिसमें ऑर्डर और ऑर्डर डेंटल टेबल शामिल है। उनके पास उनके बीच एक विदेशी कुंजी है ताकि ऑर्डर के साथ जुड़े एक से अधिक ऑर्डर डेंटल हो सकें। मैंने आदेश के बाद "अद्यतन के बाद" डीबी ट्रिगर्स भी बनाया और ऑर्डर डेंट टेबल जो एक रिकॉर्ड अपडेट होने पर डेटटाइम फ़ील्ड को अद्यतन करता है।
दूसरा, मैंने एक साधारण WPF एप्लिकेशन बनाया और मेरे डेटाबेस से उत्पन्न एक ADO.NET इकाई मॉडल बनाया।
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MyEntities context = new MyEntities();
Order order = (from o in context.Orders
select o).FirstOrDefault();
OrderDetail orderDetail = (from d in order.OrderDetails
select d).FirstOrDefault();
orderDetail.Qty = 7;
context.SaveChanges();
}
}
मैं अपने आदेश और OrderDetail वस्तुओं के लिए किसी भी समारोह मानचित्रण कर के बिना कार्यक्रम भागा:
तीसरा, मैं इस प्रकार मेरी कक्षा निर्माता पर कोड जोड़ दिया। नतीजा बिल्कुल वैसा ही था जो मैं देखने की उम्मीद करता हूं, ऑर्डरडिंट रिकॉर्ड 7 की मात्रा के लिए अपडेट किया गया है और अपडेटडेटाइम फ़ील्ड अपडेट की तिथि और समय के साथ आबादी में है। मेरे ऑर्डर रिकॉर्ड में कोई बदलाव नहीं है जिसका मतलब है कि कोई अपडेट नहीं हुआ है।
मैं फिर डीबी में ऑर्डर और ऑर्डर डेंटल टेबल के अपडेट को संभालने के लिए संग्रहित प्रक्रियाएं बनाता हूं। वे कुछ भी विशेष नहीं करते हैं, बस तालिका में प्रत्येक कॉलम के लिए पैरामीटर स्वीकार करते हैं और फिर प्रत्येक फ़ील्ड को संबंधित पैरामीटर के बराबर सेट करते हैं। मैंने मैपिंग विवरण (कार्य करने के लिए मानचित्र इकाई) विंडो का उपयोग करके उन संग्रहीत प्रक्रियाओं को अपने मॉडल ऑब्जेक्ट्स में मैप किया।
मानचित्रण करने के बाद, मैंने कार्यक्रम चलाया। नतीजतन मैंने ऑर्डर डेंटल टेबल पर अपडेट देखने के अपेक्षित व्यवहार को देखा, लेकिन इसके अलावा ऑर्डर टेबल "अपडेट के बाद" ट्रिगर को निकाल दिया गया था और UdateDateTime फ़ील्ड को अपडेट की तारीख और समय पर सेट किया गया था - जिसे मैं उम्मीद नहीं करता।
क्या कोई भी सभी सम्मिलित, अद्यतन और हटाए गए संचालन के लिए संग्रहीत प्रक्रियाओं का उपयोग करने के तरीके के बारे में जानता है और अपडेट संबंधित संस्थाओं के लिए अद्यतन नहीं है?
बस यह सुनिश्चित करने के लिए, आपकी त्रुटि से जुड़े कोई अन्य कोड नहीं है? – Nix
मुझे कोई त्रुटि नहीं दिखाई दे रही है। मैं केवल उस व्यवहार को नहीं देख रहा हूं जो मुझे उम्मीद है और मैं सोच रहा हूं कि अपेक्षित व्यवहार को देखने के लिए मुझे और क्यों करना है, जो कि केवल डीबी में पता इकाई को अद्यतन किया जाएगा। एकमात्र अन्य कोड मेरे संदर्भ ऑब्जेक्ट का तात्कालिकता होगा जो ईएफ उत्पन्न इकाई संदर्भ का एक नया उदाहरण बनाता है। – Filosopher
अपडेट: जैसा कि मैंने अपनी मूल पोस्टिंग में कहा है, मैं अपनी सभी टेबल पर बनाएं, अपडेट और डिलीट को संभालने के लिए संग्रहीत प्रक्रियाओं का उपयोग कर रहा हूं। मैंने बस अपने मॉडल से उन मैपिंग को हटा दिया और व्यक्ति तालिका पर डीबी ट्रिगर के साथ कोड फिर से चलाया और कोई अपडेट नहीं हुआ। ऐसा लगता है कि यह बनाएँ, अद्यतन और हटाएं के लिए स्पोक मैपिंग है जो इस मामले में अद्यतन होने का कारण बन रहा है। दुर्भाग्य से, हमें उन परिचालनों के लिए स्पॉक्स का उपयोग करना होगा ताकि एक संकल्प अभी भी आवश्यक हो। मैंने सोचा कि मैं अधिक जानकारी के साथ पोस्टिंग अपडेट करूँगा। – Filosopher