লেনদেন বা সেভচেনজ (মিথ্যা) এবং একসেপ্টএল চ্যাঞ্জস () ব্যবহার করছেন?


346

আমি লেনদেনগুলি তদন্ত করে চলেছি এবং দেখা যাচ্ছে যে আমি যতক্ষণ falseযেতে পেরেছি ততক্ষণ তারা EF এ নিজের যত্ন নেয় SaveChanges()এবং তারপরে AcceptAllChanges()কোনও ত্রুটি না থাকলে কল করুন :

SaveChanges(false);
// ...
AcceptAllChanges();

কিছু খারাপ হলে কি হবে? আমাকে কী রোলব্যাক করতে হবে না বা, আমার পদ্ধতিটি সুযোগের বাইরে চলে যাওয়ার সাথে সাথেই কি লেনদেন শেষ হয়েছে?

লেনদেনের মধ্য দিয়ে অর্ধেক পথ নির্ধারিত যে কোনও ইন্ডিটি কলামের কী হবে? আমার ধারণা, আমার খারাপ হওয়ার আগে যদি অন্য কেউ আমার পরে কোনও রেকর্ড যুক্ত করে থাকে তবে এর অর্থ হ'ল আইডেন্টিটির কোনও মূল্য নেই।

TransactionScopeআমার কোডে স্ট্যান্ডার্ড ক্লাস ব্যবহার করার কোনও কারণ আছে কি ?


1
এটি আমাকে SaveChanges(fase); ... AcceptAllChanges();প্রথমে কেন একটি প্যাটার্ন ছিল তা বুঝতে সহায়তা করেছিল । লক্ষ্য করুন যে কীভাবে উপরোক্ত প্রশ্নের গৃহীত উত্তর, কোনও ব্লগের লেখক লিখেছেন - এবং অন্য ব্লগে সেই ব্লগটি উল্লেখ করা হয়েছে। এটি সব একসাথে আসে।
লাল মটরটি

উত্তর:


451

সত্তা ফ্রেমওয়ার্কের সাথে বেশিরভাগ সময়ই 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কোথাও কোথাও পুনরায় চেষ্টা বা লগিংয়ের মাধ্যমে ক্ষতিপূরণ দিতে পারবেন ।

আরও জন্য আমার ব্লগ পোস্ট দেখুন।


3
দুর্দান্ত, ধন্যবাদ ... তাই যদি কিছু ব্যর্থ হয় তবে আমাকে রোলব্যাক করতে হবে না ?? সেভচেনজেসস, এটি সংরক্ষণের জন্য চিহ্নিত করে, তবে আসলে আমি প্রতিশ্রুতি দেয় না যতক্ষণ না আমি গ্রহণযোগ্য পরিবর্তনগুলি না করি .. তবে যদি কিছু ভুল হয়ে যায় .. তবে আমাকে কী রোলব্যাকের দরকার হবে যাতে আমার অবজেক্টটি তার সঠিক অবস্থানে ফিরে আসে?
স্মিথটি

33
@ মার্ক: যদি "রোল-ব্যাক" দ্বারা আপনি বোঝাতে চান, আপনার বিষয়বস্তুগুলি ডাটাবেসে রয়েছে এমন অবস্থায় ফিরিয়ে দিন, তবে না, আপনি এটি করতে চাইবেন না কারণ আপনি সামগ্রীতে ব্যবহারকারীর সমস্ত পরিবর্তন হারাবেন । SaveChanges(false)ডাটাবেসটিতে আসল আপডেট করা কি AcceptAllChanges()ইএফকে বলে, "ঠিক আছে, কোন জিনিসগুলি সংরক্ষণ করা দরকার তা আপনি ভুলে যেতে পারেন, কারণ সেগুলি সফলভাবে সংরক্ষণ করা হয়েছে।" যদি SaveChanges(false)ব্যর্থ হয়, AcceptAllChanges()কখনই ডাকা হবে না এবং EF এখনও আপনার অবজেক্টটিকে এমন বৈশিষ্ট্য হিসাবে বিবেচনা করবে যেগুলি পরিবর্তিত হয়েছিল এবং এটি ডাটাবেসে সংরক্ষণ করতে হবে।
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

কোড ফার্স্ট ব্যবহার করে এটি কীভাবে করবেন তা আপনি পরামর্শ দিতে পারেন? SaveChanges বা AcceptAllChanges পদ্ধতিটির কোনও প্যারামিটার নেই
কার্স্টেন লোভ


13
এটি EF 6.1 এ আর সম্ভব নয়। আপনি কি জানেন যে এখন কাজ করার জন্য কী ধরণের সমন্বয় করা দরকার?
অ্যালেক্স ড্রেস্কো

113

আপনি যদি EF6 (সত্তা ফ্রেমওয়ার্ক 6+) ব্যবহার করেন, এটি এসকিউএল-তে ডাটাবেস কলগুলির জন্য পরিবর্তিত হয়েছে।
দেখুন: http://msdn.microsoft.com/en-us/data/dn456843.aspx

প্রসঙ্গ ব্যবহার করুন। ডেটাবেস.বিগানট্রান্সঅ্যাকশন।

এমএসডিএন থেকে:

using (var context = new BloggingContext()) 
{ 
    using (var dbContextTransaction = context.Database.BeginTransaction()) 
    { 
        try 
        { 
            context.Database.ExecuteSqlCommand( 
                @"UPDATE Blogs SET Rating = 5" + 
                    " WHERE Name LIKE '%Entity Framework%'" 
                ); 

            var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
            foreach (var post in query) 
            { 
                post.Title += "[Cool Blog]"; 
            } 

            context.SaveChanges(); 

            dbContextTransaction.Commit(); 
        } 
        catch (Exception) 
        { 
            dbContextTransaction.Rollback(); //Required according to MSDN article 
            throw; //Not in MSDN article, but recommended so the exception still bubbles up
        } 
    } 
} 

51
আপনি যখন লেনদেনে "ব্যবহার করে" ব্যবহার করছেন তখন রোলব্যাকের সাথে চেষ্টা করার দরকার নেই।
রবার্ট

12
আমি এইভাবে ব্যতিক্রম আটকে একটি ব্যতিক্রম গ্রহণ করছি। এটি ডাটাবেস অপারেশনটি নিঃশব্দে ব্যর্থ করে তোলে। এসওর প্রকৃতির কারণে, কেউ এই উদাহরণটি নিতে পারেন এবং এটি একটি উত্পাদন অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারেন।
বি 2 কে

3
@ বি 2 কে: ভাল কথা, তবে এই কোডটি লিঙ্কযুক্ত মাইক্রোসফ্ট নিবন্ধ থেকে অনুলিপি করা হয়েছে । আমি আশা করি উত্পাদনে তাদের কোডটি কেউ ব্যবহার করেন না :)
জে ব্রায়ান প্রাইস

6
@ রবার্ট এমএসডিএন নিবন্ধ অনুসারে রোলব্যাক () প্রয়োজনীয়। তারা উদ্দেশ্যমূলকভাবে ট্রানজেকশনস্কোপের উদাহরণের জন্য একটি রোলব্যাক কমান্ড ছেড়ে দেয়। @ বি 2 কে আমি throw;এমএসডিএন স্নিপেটে যুক্ত করেছি এবং স্পষ্টভাবে ইঙ্গিত করেছি যে এটি এমএসডিএন নিবন্ধ থেকে আসল নয়।
টড

6
(যদি সঠিক হয়) এটি জিনিস পরিষ্কার করতে পারে: EF + এমএসএসকিউএলের মতো শব্দগুলির রোলব্যাকের প্রয়োজন নেই, তবে EF + অন্যান্য এসকিউএল সরবরাহকারী হতে পারে। যেহেতু ইএফ এটি কোন ডাটাবেসের সাথে কথা বলছে তা অজ্ঞানীয় বলে ধারণা করা Rollback()হচ্ছে , এটি মাইএসকিএল বা এমন কোনও জিনিসের সাথে কথা বলার ক্ষেত্রে বলা হয় যার স্বয়ংক্রিয় আচরণ নেই।
শব্দগুলি

-5

কারণ কিছু ডাটাবেস dbContextTransaction.Commit () এ একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে এটি আরও ভাল:

using (var context = new BloggingContext()) 
{ 
  using (var dbContextTransaction = context.Database.BeginTransaction()) 
  { 
    try 
    { 
      context.Database.ExecuteSqlCommand( 
          @"UPDATE Blogs SET Rating = 5" + 
              " WHERE Name LIKE '%Entity Framework%'" 
          ); 

      var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
      foreach (var post in query) 
      { 
          post.Title += "[Cool Blog]"; 
      } 

      context.SaveChanges(false); 

      dbContextTransaction.Commit(); 

      context.AcceptAllChanges();
    } 
    catch (Exception) 
    { 
      dbContextTransaction.Rollback(); 
    } 
  } 
} 

7
আমি এইভাবে ব্যতিক্রম আটকে একটি ব্যতিক্রম গ্রহণ করছি। এটি ডাটাবেস অপারেশনটি নিঃশব্দে ব্যর্থ করে তোলে। এসওর প্রকৃতির কারণে, কেউ এই উদাহরণটি নিতে পারেন এবং এটি একটি উত্পাদন অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারেন।
বি 2 কে

6
এটি মূলত এমএসডিএন পৃষ্ঠাতে উদ্ধৃত হওয়া অন্য উত্তরগুলির মতো নয়? শুধু পার্থক্য আমি দেখছি তোমরা পাস হয় বা , এবং অতিরিক্ত কল । falsecontext.SaveChanges();context.AcceptAllChanges();
ওয়াই হা লি

@ বি 2 কে রোলব্যাকের প্রয়োজন নেই - যদি লেনদেন কাজ না করে তবে প্রতিশ্রুতিবদ্ধ নয়। রোলব্যাকের স্পষ্ট কলটিও ব্যর্থ হতে পারে - আমার উত্তরটি এখানে দেখুন stackoverflow.com/questions/41385740/…
কেন

রোলব্যাকটি এমন নয় যা আমি আপত্তি করছি। এই উত্তরের লেখক ব্যতিক্রমটি পুনর্বিবেচনার জন্য তাদের কোড আপডেট করেছে, এভাবে আমি যা আপত্তি করছি তা সমাধান করে।
বি

দুঃখিত, আমি আমার ফোন থেকে মন্তব্য করেছি। টড ব্যতিক্রমটিকে আবার নিক্ষেপ করে, ইমেইল তা করে না। ক্যাচটিতে এমন কিছু থাকা উচিত যা বিকাশকারীকে বা রোলব্যাকের কারণে সৃষ্ট সমস্যার ব্যবহারকারীকে জানিয়ে দেয়। এটি কোনও লগ ফাইলে লিখতে, ব্যতিক্রমটি নতুন করে লিখতে বা ব্যবহারকারীর কাছে কোনও বার্তা ফেরত পাঠানো হতে পারে।
বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.