हम धीरे-धीरे इकाई ढांचे (4.3.1) द्वारा विरासत डेटा एक्सेस कोड को बदलने की प्रक्रिया में हैं। कुछ अवसरों में हम काम की एक इकाई में डेटा पहुंच के दोनों तरीकों का उपयोग करने से नहीं बच सकते हैं। आदर्श रूप में, यह एक लेनदेन में किया जाना चाहिए। हालांकि, पुराना कोड SqlTransaction
एस का उपयोग करता है जो Commit()
पर कॉल करता है जब काम की एक इकाई होती है और ईएफ अपने लेनदेन का प्रबंधन करता है।SqlTransaction को अनदेखा करें। लेनदेनस्कोप के भीतर टिप्पणी
तो हमने TransactionScope
में "पुराना" और "नया" कोड लपेटने का विचार किया। हालांकि, आसपास के TransactionScope
के भीतर एक कमिटिट हमेशा निष्पादित होती है, भले ही TransactionScope
पूरा नहीं हुआ हो। यह कोड स्निपेट मेरी समस्या दिखाता है:
using (var conn = new SqlConnection("connection string"))
{
conn.Open();
using (var scope = new TransactionScope())
{
using (var tr = conn.BeginTransaction())
{
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tr;
cmd.CommandText = "some update statement";
cmd.ExecuteNonQuery();
}
tr.Commit();
}
// In reality the code above is part of a legacy DAL, immutable.
// (can't insert SaveChanges before tr.Commit).
context.SaveChanges();
if (<all ok>) // pseudo code for exception handling.
scope.Complete();
}
}
अद्यतन बयान अभी भी लिए प्रतिबद्ध है जब scope.Complete()
मारा नहीं है।
तो ऐसा लगता है कि, मैं एक लेनदेन में निष्पादित करने के लिए पुराने डेटा एक्सेस कोड और SaveChanges
को लागू करने के लिए TransactionScope
का उपयोग नहीं कर सकता। या SqlTransaction.Commit कथन को ओवरराल करने का कोई तरीका है?
मुझे पता है कि अधिक पोस्ट यहाँ TransactionScope और SqlTransaction के बारे में हैं कि, लेकिन वे सभी (ठीक ही) का कहना है कि SqlTransaction का उपयोग करके आवश्यक (और न ही अनुशंसित) नहीं है जब TransactionScope का उपयोग कर। लेकिन SqlTransaction का उपयोग नहीं करना यहां एक विकल्प नहीं है। हमारे पास एक विरासत ढांचा है जो अपने SqlTransaction
एस करता है और उसके लेनदेन तंत्र में शामिल होने के लिए कोई एपीआई नहीं है।
क्या आपके पास कम से कम कनेक्शन तक पहुंच है? –
@ LadislavMrnka नहीं, कॉन्फ़िगरेशन फ़ाइल में कनेक्शन स्ट्रिंग के अलावा। –