एंटिटी फ्रेमवर्क के साथ ज्यादातर समय SaveChanges()
पर्याप्त होता है। यह एक लेनदेन बनाता है, या किसी भी परिवेश के लेनदेन में संलग्न करता है, और उस लेनदेन में सभी आवश्यक कार्य करता है।
कभी-कभी हालांकि SaveChanges(false) + AcceptAllChanges()
युग्मन उपयोगी होता है।
इसके लिए सबसे उपयोगी स्थान उन स्थितियों में है जहां आप दो अलग-अलग संदर्भों में एक वितरित लेनदेन करना चाहते हैं।
यानी ऐसा कुछ (बुरा):
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
यदि context1.SaveChanges()
सफल हो context2.SaveChanges()
जाता है, लेकिन विफल रहता है तो पूरा वितरित लेन-देन निरस्त कर दिया जाता है। लेकिन दुर्भाग्य से एंटिटी फ्रेमवर्क ने पहले ही बदलावों को छोड़ दिया है context1
, इसलिए आप विफलता को फिर से खेलना या प्रभावी रूप से लॉग इन नहीं कर सकते।
लेकिन अगर आप अपना कोड इस तरह बदलते हैं:
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
जबकि SaveChanges(false)
डेटाबेस में आवश्यक कमांड भेजने के लिए कॉल किया जाता है, संदर्भ ही नहीं बदला जाता है, इसलिए यदि आवश्यक हो, तो आप इसे फिर से कर सकते हैं, या आप चाहें तो पूछताछ कर सकते ObjectStateManager
हैं।
इसका मतलब यह है कि यदि लेन-देन वास्तव में एक अपवाद फेंकता है जिसकी आप क्षतिपूर्ति कर सकते हैं, तो ObjectStateManager
कहीं न कहीं प्रत्येक संदर्भ की पुन: कोशिश या लॉगिंग स्थिति ।
अधिक के लिए मेरी ब्लॉग पोस्ट देखें ।
SaveChanges(fase); ... AcceptAllChanges();
कि पहली जगह में एक पैटर्न क्यों था। ध्यान दें कि उपरोक्त प्रश्न का स्वीकृत उत्तर किसी ब्लॉग के लेखक द्वारा कैसे लिखा गया है - और वह ब्लॉग दूसरे प्रश्न में संदर्भित है। यह सब एक साथ आता है।