ksg
ksg

Reputation: 4067

How to rollback a transaction in EntityFramework?

I have two database tables named Courses and Transactions.Courses stores the details of a particular course and Transactions table stores the details of the transactions performed by a particular user.

My question is how can I make sure that entry in the CourseTable is saved only when transactions(add,edit,delete) regarding that particular course is saved into the TransactionTable

CourseTable is

enter image description here

TransactionTable is

enter image description here

Controller is

     POST: /Course/Add
    [HttpPost]
    public ActionResult Add(CourseVM _mdlCourseVM) 
    {
            string actionName=this.ControllerContext.RouteData.Values["action"].ToString();
                string controllerName=this.ControllerContext.RouteData.Values["controller"].ToString();

                Course _course = new Course();
                _course.Duration = _mdlCourseVM.Course.Duration;
                _course.DurationMode = _mdlCourseVM.DurationModeId;
                _course.InstalmentFee = _mdlCourseVM.Course.InstalmentFee;
                _course.Name = _mdlCourseVM.Course.Name;
                _course.SingleFee = _mdlCourseVM.Course.SingleFee;

                _db.Courses.Add(_course);

                int i = _db.SaveChanges();

                if (i > 0)
                {
                    Common _cmn=new Common();

                    //Add the transaction details 
                    int k=_cmn.AddTransactions(actionName,controllerName,"");

                   //Want to commit changes to the coursetable here
                   if(k>0){                         
                      _db.commitTransaction()
                   }
                   //Want to rollback the committed transaction
                   else{                        
                      _db.rollbackTransaction();
                   }

                }
    }

Upvotes: 1

Views: 1502

Answers (1)

ksg
ksg

Reputation: 4067

I solved the above scenario by using System.Transactions.Hope anyone with same scenario find it useful.

 using (TransactionScope _ts = new TransactionScope())
                {
                    string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
                    string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();

                    Course _course = new Course();
                    _course.Duration = _mdlCourseVM.Course.Duration;
                    _course.DurationMode = _mdlCourseVM.DurationModeId;
                    _course.InstalmentFee = _mdlCourseVM.Course.InstalmentFee;
                    _course.Name = _mdlCourseVM.Course.Name;
                    _course.SingleFee = _mdlCourseVM.Course.SingleFee;

                    _db.Courses.Add(_course);
                    int i = _db.SaveChanges();

                    if (i > 0)
                    {
                        Common _cmn = new Common();
                        int k = _cmn.AddTransactions(actionName, controllerName, "",Session["UserId"].ToString());
                        if (k > 0)
                        {
                            _ts.Complete();
                            return Json(new { message = "success" }, JsonRequestBehavior.AllowGet);
                        }
                        else
                        {
                            return Json(new { message = "error" }, JsonRequestBehavior.AllowGet);
                        }

                    }
                    else 
                    {
                        return Json(new { message = "error" }, JsonRequestBehavior.AllowGet);
                    }

                }
            }

Upvotes: 1

Related Questions