সত্তা ফ্রেমওয়ার্কের সাথে বেশিরভাগ সময়ই 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();
প্রথমে কেন একটি প্যাটার্ন ছিল তা বুঝতে সহায়তা করেছিল । লক্ষ্য করুন যে কীভাবে উপরোক্ত প্রশ্নের গৃহীত উত্তর, কোনও ব্লগের লেখক লিখেছেন - এবং অন্য ব্লগে সেই ব্লগটি উল্লেখ করা হয়েছে। এটি সব একসাথে আসে।