Simple way of using transactions in ADO.NET Entity framework

SheoNarayan
Posted by in LINQ category on for Beginner level | Points: 250 | Views : 22526 red flag
Rating: 5 out of 5  
 1 vote(s)

In this article, we shall learn how to use transactions in ADO.NET Entity framework in simplified manner.

Introduction

First thing first, What is transaction ?

As per MSDN, Transactions are groups of database commands that execute as a package. Using a transaction gives your application the ability to abort (roll back) all changes executed from within the transaction if any errors occur during any part of the transaction process. What this necessarily means that if we are executing three SQL commands in a group and if one of them fails, the database will not get affected (eg. if first two commands has executed successfully and the last one failed, the changes made by first two SQL commands will be rolled back and database will not be affected).

What is ADO.NET Entity Framework?

ADO.NET Entity Framework is an object-relational mapping (ORM) framework for the .NET application that can be used to perform Create, Read, Update and Delete operations in the database. It also helps us speedy development as we do not need to write ADO.NET code ourselves. We just need to add an ADO.NET Entity data model and write few lines of code to perform database operations.

Objective

The objective of this article is to demonstrate, how to use transactions in ADO.NET Entity framework. To achieve this, we are going to use TransactionScope class that exists in System.Transactions namespace. To know more about TransactionScope and its use in normal coding, read this article.

Get 500+ ASP.NET web development Tips & Tricks and ASP.NET Online training here.

Using the code

To demonstrate using transactions in ADO.NET Entity Framework, I have created a simple .aspx page with two GridViews and a Button.

<asp:GridView ID="GridView1" runat="server" EnableViewState="false" />

<asp:GridView ID="GridView2" runat="server" EnableViewState="false" />

<asp:Button ID="fdas" runat="server" Text="Save with transaction" OnClick="SaveUsingLinqWithTransaction" />


Two GridViews list records from PersonalDetail and Menu tables (this is the simple table structure) separately. On click of the button, we are calling SaveUsingLinqWithTransaction method and below is the code of this method.

Namespace to use

using System.Transactions;

protected void SaveUsingLinqWithTransaction(object sender, EventArgs e)

{

using (TransactionScope scope = new TransactionScope()) // exists in System.Transactions

{

try

{

using (DemoDatabaseDB db = new DemoDatabaseDB()) // Context object

{

PersonalDetail p = new PersonalDetail()

{

Active = true,

Age = int.MaxValue,

FirstName = "firstnamne",

LastName = "lastname"

};

db.PersonalDetails.AddObject(p);

db.SaveChanges();

DemoDatabaseModel.Menu m = new DemoDatabaseModel.Menu()

{

MenuDescription = "description1",

MenuName = "Menu1Menu1Menu1Menu1Menu1Menu1Menu21",

MenuUrl = "http://www.fundooVideo.com/",

ParentMenuId = 1,

MenuId = 1245

};

 

db.Menus.AddObject(m);

db.SaveChanges();

db.AcceptAllChanges();

}

scope.Complete(); // transaction complete

}

catch (Exception ee)

{

Response.Write(ee.ToString());

}

}

}

 
In the above code snippet, we have instantiated TransactionScope class with using block. It ensures that when we are done with this object, it is disposed so we do not have memory leak problem.

DemoDatabaseDB is my context class of ADO.NET Entity Framework that has also been instantiated with using block. We are first trying to add a PersonalDetail data into the database so we have instantiated that class and set the value, to save this data to the database we have added this object into AddObject method of the PersonalDetails object of the context object and called the SaveChanges() method.

Similarly, we have done the same for the Menu data as well. At last we have called the Complete() method.

Wrapping our ADO.NET Entity Framework commands inside the TransactionScope ensures that all commands executed on the object actually temporarily affects the database and once the .Complete() method is called, these operations are marked as permanent. 

Note that in case you have a AutoIncrement column in the database table and the transactions fails, the auto increment value will increase by 1 every time it fails.

As against the normal ADO.NET Transaction, there is no Rollback() method of the TransactionScope here. Unless you call the Complete() method, the transaction is not treated as complete and all the operations are rolled back automatically.

Is there any other way to achieve the transactions in ADO.NET Entity framework?

Yes, there is one more way to achieve the same thing explained here and Deeraj has written a nice article on this long back.

Thanks for reading and hope this article was useful. 

Keep learning and sharing knowledge on DotNetFunda.com website.
Page copy protected against web site content infringement by Copyscape

About the Author

SheoNarayan
Full Name: Sheo Narayan
Member Level: HonoraryPlatinum
Member Status: Administrator
Member Since: 7/8/2008 6:32:14 PM
Country: India
Regards, Sheo Narayan http://www.dotnetfunda.com

Ex-Microsoft MVP, Author, Writer, Mentor & architecting applications since year 2001. Connect me on http://www.facebook.com/sheo.narayan | https://twitter.com/sheonarayan | http://www.linkedin.com/in/sheonarayan

Login to vote for this post.

Comments or Responses

Login to post response

Comment using Facebook(Author doesn't get notification)