استفاده از Transaction در EntityFramework

در این مقاله مختصری درباره Transaction و نحوه استفاده از در تکنولوژی های جدیدی مانند EntityFramework صحبت خواهد شد

استفاده از Transaction در EntityFramework

با سلام خدمت دوستان

در این مقاله سعی در معرفی روشی برای استفاده از Transaction ها در EntityFramework خواهیم پرداخت

در حال حاظر از فایل DBML (Linq To SQL) برای این پروژه استفاده شده اما در واقع هیچ مشکلی برای استفاده مشابه آن در فایل EDMX و یا Code First نیز وجود نخواهد داشت

در اینجا دو روش معرفی می شود. روش ساده تر و استفاده از کلاس TransactionScope که برای اینکار نیاز به اضافه کردن رفرنس System.Transactions دارید

سپس با استفاده از کد زیر قابلیت اجرای کد ها به شکل Transactional وجود خواهد داشت

نمونه کد مربوطه

  private void Method2OfTransaction()
        {
            //http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx

            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    // Your code
                    var context = new DataClasses1DataContext();
                    var a = new Tree { Name = "Node 1", ParentTreeId = null };
                    context.Trees.InsertOnSubmit(a);
                    //throw new Exception("not support!");
                    // do db stuff here...
                   
                    context.SubmitChanges();

                    scope.Complete(); //  To commit.
                    // more info you can see http://www.codeproject.com/Articles/690136/All-About-TransactionScope

                }
                catch (Exception ex)
                {

                }
            }

و در روش دوم امکان تغییر کد در صفحات مختلف وجود داشته ولی کمی از متد قبلی پیچیده تر می باشد. برای استفاده از این روش ابتدا یک Extended Method به نام BeginTransaction تعریف می کنیم .

 public static class ExtendedFunction
    {
        public static DbTransaction BeginTransaction(this DataClasses1DataContext context)
        {
            if (context.Connection.State != ConnectionState.Open)
            {
                context.Connection.Open();
            }
            return context.Connection.BeginTransaction();
        }
    }

در این کد در صورتی که کانکشن به دیتابیس بر قرار شده باشد تنها یک Transaction شروع شده و مقدار آن بازگشت می یابد. سپس با کد زیر قابلیت قبول و یا رد تغییرات انجام شده را دارید.

 private void Method1OfTrasaction()
        {
            using (var context = new DataClasses1DataContext())
            using (var tx = context.BeginTransaction())
            {
                try
                {
                    var a = new Tree { Name = "Node 1", ParentTreeId = null };
                    context.Trees.InsertOnSubmit(a);
                    throw new Exception("not support!");
                    // do db stuff here...
                    tx.Commit();
                    context.SubmitChanges();

                }
                catch (Exception ex)
                {
                    tx.Rollback();
                }
            }
        }

فقط به یاد داشته باشید استفاده از Transaction ها همیشه سربار پردازشی دارد و فقط در مواقع لزوم از آنها استفاده نمایید

کد پیوست به زبان #WPF C نوشته شده است

 

فایل های ضمیمه