मैं एक तरह से एक प्रश्न निष्पादित करने के लिए, जबकि एक TransactionScope जीवित है के लिए देख रहा हूँ के लिए TransactionScope पर ध्यान न दें, और उपेक्षा TransactionScope - मूल रूप से, मैं कोई बात नहीं क्या इस विशेष क्वेरी निष्पादित करने के लिए चाहते हैं।विशिष्ट क्वेरी
मैं ईएफ कोड-प्रथम का उपयोग कर रहा हूं, और जिस तरह से एप्लिकेशन डिज़ाइन किया गया है, एक नए डेटा संदर्भ को एक ही कॉल में कई बार खोला जाता है, प्रत्येक में अपने स्वयं के परिवर्तन होते हैं, और उनमें से सभी एक एकल लेनदेनस्कोप के भीतर होते हैं , जिसमें Complete()
है, अंत में कोई असफलता मानते हुए कहा जाता है। संदर्भ के अंदर हम SaveChanges
अधिरोहित गया है ताकि किसी भी अपवाद base.SaveChanges()
पर होता है, तो हम उसे पकड़ने और लेन-देन वापस रोलिंग से पहले डेटाबेस के लिए लॉग इन कर सकते।
चूंकि SaveChanges
लेनदेन के अंदर होता है, इसलिए लॉगिंग स्पष्ट रूप से नहीं होती है, क्योंकि यह मूल कॉल के समान लेनदेन से संबंधित है। मैं केवल लॉगिंग कोड के लिए ट्रांज़ेक्शनस्कोप को अनदेखा करने की कोशिश कर रहा हूं।
यहाँ कुछ छीन नीचे कोड है:
// From the context
public override int SaveChanges() {
try {
return base.SaveChanges();
} catch (Exception ex) {
// Writes to the log table - I want this to run no matter what
LogRepo.Log(/*stuff to log from the context*/);
throw;
}
}
// Inside the business logic
public void DoSomething() {
try {
using (var scope = new TransactionScope()) {
using (var context = new FooContext()) {
// Do something
context.SaveChanges();
}
using (var context = new FooContext()) {
// Do something else
context.SaveChanges();
}
scope.Complete();
}
} catch (Exception ex) {
// scope.Complete is never called, so the transaction is rolled back
}
}
मैं प्रवेश के लिए एफई के बजाय नियमित ADO.NET उपयोग करने की कोशिश, लेकिन अभी भी एक ही परिणाम - इसे वापस भी लुढ़का हो जाता है।
मुझे SaveChanges
के अंदर होने वाली त्रुटि प्रबंधन की आवश्यकता है, क्योंकि जो मैं लॉगिंग कर रहा हूं वह उन संस्थाओं की स्थिति है जो सहेजे जा रहे हैं - इसलिए मैं कहीं और आसानी से लॉगिंग नहीं कर सकता। मैं जबकि SaveChanges catch
अंदर संदेश बना सकते हैं, और यह फेंक और DoSomething catch
यह लोग इन करते हैं, लेकिन वहाँ DoSomething
तरीकों के दर्जनों रहे हैं, और मैं बहुत बल्कि सिर्फ एक ही स्थान पर इस समस्या से निपटने चाहते हैं।
बिल्कुल सही! वास्तव में जो मैं खोज रहा था। परीक्षण किया गया और यह नियमित एडीओ.NET और इकाई फ्रेमवर्क दोनों में काम करता है धन्यवाद। –
बस इसे कार्यान्वित किया गया और अब मुझे यह त्रुटि मिलती है: वितरित लेनदेन प्रबंधक (एमएसडीटीसी) के लिए नेटवर्क एक्सेस अक्षम कर दिया गया है। कृपया घटक सेवा प्रशासनिक टूल का उपयोग कर एमएसडीटीसी के लिए सुरक्षा कॉन्फ़िगरेशन में नेटवर्क एक्सेस के लिए डीटीसी सक्षम करें। मैंने इसे खोलना पढ़ा कई लेन-देन इस त्रुटि का कारण बन सकते हैं? –
इसने मुझे बहुत सी सिरदर्द बचाया! मैं एक लेनदेन के अंदर एमएसएमक्यू संदेशों को संसाधित कर रहा हूं, लेकिन थोड़ा अतिरिक्त डेटा के लिए एसक्यूएल एज़ूर तक पहुंचने की जरूरत है और वे डीटीसी का समर्थन नहीं करते हैं। इसका उपयोग करना मेरे लेन-देन को अभी भी काम करने में सक्षम बनाया गया है, जबकि एज़ूर फ़ंक्शन भी दे रहा है। – RubyHaus