Saturday, 31 August 2013

Learning MVC-Part 3 : Creating MVC Application & Perform CRUD Operations Using EntityFramework

                                      In our first and second attempt to learn MVC, we learnt, what is MVC?, what is separation of concerns?, how to create a simple MVC application and perform CRUD operations on the application using LINQ to SQL.
My this article focuses on how to perform CRUD operations in MVC application by the use of an ORM(Entity Framework).
The article is an attempt to overcome the confusion related to how to use EntityFramework with MVC application in a very simple way.

Our Roadmap:

Our roadmap remains same,


Pre-requisites:

There are few pre-requisites before we start with the article,
  •        We have running sample application that we created in second part of the article series.
  •        We have EntityFramework 4.1 package or dll on our local file system.
  •        We understand how MVC application is created.


What is ORM and EntityFramework?

The topic isn’t that scary as it seems to be. ORM(Object Relational Mapping) is basically an approach for storing data from domain/entity objects to relational database in an automated way without writing much code. A true ORM is independent of what database server we refer to, the code underlying ORM’s is database independent and can run with any database server having similar database with a structure needed by the application.ORM  has 3 main parts: Entity class objects, Relational db objects and information on how domain objects maps to relational db objects i.e. tables, views & storedprocedures. ORM helps us to keep our database design separate from our domain class design. This makes our application maintainable and extendable. It also automates standard CRUD operation (Create, Read, Update & Delete) so developer doesn’t require to code them manually J.

Now let’s have a look on standard definition of Entity Framework given by Microsoft:

“The Microsoft ADO.NET Entity Framework is an Object/Relational Mapping (ORM) framework that enables developers to work with relational data as domain-specific objects, eliminating the need for most of the data access plumbing code that developers usually need to write. Using the Entity Framework, developers issue queries using LINQ, then retrieve and manipulate data as strongly typed objects. The Entity Framework’s ORM implementation provides services like change tracking, identity resolution, lazy loading, and query translation so that developers can focus on their application-specific business logic rather than the data access fundamentals.

In a simple language, Entity framework is an Object/Relational Mapping (ORM) framework. It is an enhancement to ADO.NET, an upper layer to ADO.Net that gives developers an automated mechanism for accessing & storing the data in the database.
Hope this gives a glimpse of an ORM and EntityFramework.

EntityFramework Architecture:
Let’s have a glance over the architecture of EntityFramework,
        
                                                               

Our Web Application interacts with Entity Data Model (Entity Framework), that acts as an interface between ADO.Net Provider and database, fetches/saves data in the same flow as described in the figure.

Perform CRUD operations using EntityFramework on MVC application:

Open the existing Learning MVC application that we created using LINQ to SQL,



I have made few changes in the existing application, just to make it easy to understand when we implement EntityFramework in it.
1.Changed the model class name from User to UserList,

 
3.        namespace LearningMVC.Models
4.        {
5.            #region User Model...
6.            /// <summary>
7.            /// User Model Class, purposely used for populating views and carry data from database.
8.            /// </summary>
9.            public class UserList
10.           {
11.               #region Automated Properties
12.               public int UserId { get; set; }
13.               public string FirstName { get; set; }
14.               public string LastName { get; set; }
15.               public string EMail { get; set; }
16.               public string Address { get; set; }
17.               public string PhoneNo { get; set; }
18.               public string Company { get; set; }
19.               public string Designation { get; set; } 
20.               #endregion
21.           } 
22.           #endregion
23.       }
.
     2. Changed the Solution name from LearningMVC to LearningMVCWithEF.

Steps to Follow:

1. Open the application, modify it by above given changes.
2. Delete the MyDBML.dbml class from the solution.
3. Do not build the solution now, it will result in an error, as we have removed the dbml file, so controller method accessing the dbml file will throw compile time errors.
4. Goto project right click and add new item, select Data in installed templates and add ADO.Nety EntityDataModel to the application,



Name it EFDataModel.edmx.

5.New window will be opened to choose model contents,


Since we are following Database First approach, select generate From Database.

6.Choose the connection and give the name to connection string as MVCEntities as shown in the figure, click next.


7.Provide connection details to the existing database, that we used for our existing application, database name was MVC.
If you don’t have existing one, create a new one with the attached db script files.


8. Choose data base objects, we have only one table , so choose that one as shown in figure,

Give model namespace as MVCModel.

9.We get in our solution one guest,Entity Data Model that we saw in Entity Framework Architecture above,



10. In web.config you can see a new connection string is added.Now you can comment/delete old connection string of LINQ to SQL,


11. Generating Strongly Typed Entity Model Classes:(taken from a blog)
We’ll be working with the strongly typed entity classes now. The Entity Data Model designer uses a code generator in Visual Studio called the Text Template Transformation Toolkit (T4). Entity Framework will automatically generate a User class. The code generator nowwill create a class based on our Entity Data Model.

By default, the designer uses a template that results in entity classes that inherit from Entity Framework’s EntityObject and a container class which inherits from EF’s ObjectContext.
These base classes can be cumbersome to work with for a number of reasons. While the ObjectContext is extremely useful when you need a lot of control over Entity Framework’s behavior, the lighter weight DbContext provides access to the most commonly needed tasks and simplifies your coding.
Microsoft provides a number of alternative T4 templates for generating classes from the EDM.  When you installed the EF 4.1, a template for creating simpler classes including the DbContext was added to Visual Studio. Let’s tell the designer to use this template instead of the default.
·      Right click on the model’s designer surface.
·      From the context menu, choose Add Code Generation Item.
·      In the Add New Item dialog that opens, select Code from the list of installed templates types on the left.

·      Choose the ADO.NET DbContext Generator then click the Add button.


Two new files will be listed in Solution Explorer, Model1.Context.tt and Model1.tt. These are template files. Expand the templates to see the generated classes as shown in following figure,



12. When we open these two new guests, we see the context class to access model and model class for our user entity is already created, with full code,




Have you noticed that we have’nt written a single line of code by our hand, this is the revolution that EntityFramework has come up with, Let’s give a round of applause to our smart work,






Time to write some code now:

Till now we have not written a single line of code, but to access th context class, we need to change the logic from accessing LINQ to SQL data context to EntityFramework data context in the controller we created earlier in second part of the tutorial.

Steps to follow:

Step1: Bind all our views with UserList class, later it was user class, but we changed that to UserList class (remember????)

Step2:Open the controllers, change the access mechanism of context class as shown below for e.g. Index Action,
Earlier
public ActionResult Index()
        {
            var dbContext = new MyDBDataContext();
            var userList = from user in dbContext.Users select user;
            var users = new List<LearningMVC.Models.User>();
            if (userList.Any())
            {
                foreach (var user in userList)
                {
                    users.Add(new LearningMVC.Models.User() 
                    { UserId = user.UserId, Address = user.Address, 
                    Company = user.Company, FirstName =    user.FirstName, 
                    LastName = user.LastName, Designation = user.Designation, 
                    EMail = user.EMail, PhoneNo = user.PhoneNo });
                }
            }
            ViewBag.FirstName = "My First Name";
            ViewData["FirstName"] = "My First Name";
            if(TempData.Any())
            {
                var tempData = TempData["TempData Name"];
            }
            return View(users);
        }
Now

public ActionResult Index()
        {
            var dbContext = new MVCEntities() ;
            var userList = from user in dbContext.Users select user;
            var users = new List<LearningMVC.Models.UserList>();
            if (userList.Any())
            {
                foreach (var user in userList)
                {
                    users.Add(new LearningMVC.Models.UserList() 
                    { UserId = user.UserId, Address = user.Address, 
                    Company = user.Company, FirstName = user.FirstName, 
                    LastName = user.LastName, Designation = user.Designation, 
                    EMail = user.EMail, PhoneNo = user.PhoneNo });
                }
            }
            ViewBag.FirstName = "My First Name";
            ViewData["FirstName"] = "My First Name";
            if(TempData.Any())
            {
                var tempData = TempData["TempData Name"];
            }
            return View(users);
        }

You can see we just had to change access mechanism, mere change of 2-3 lines, and not anything in the logic of application.

Step3: Like wise do the same for all the Actions. I am not showing how to do here, but you can compare the source codes and now can do by yourself.

Step4: Note LINQ to SQL context class uses InsertOnSubmit()/DeleteOnSubmit() and SubmitChanges() method for Insert, update,Delete but EF context class uses .Add(), .SaveChanges().So do it skillfully when required.

Step5: All set now, rebuild your application, and you’ll not get a single error.Now ready to run.

Step6: When you run the application, it runs as was running previously and now you can perform CRUP operations as an end user to the application, and test the application .



Nothing more dude, we are done with Entity framework’s database first approach now.You can applause again, and take some rest.
 

Conclusion:

We have already moved to one step on advanced level of CRUD operations in MVC.There is more to learn in MVC and Entity Framework, that we’ll be covering in upcoming articles.In this article we mastered how to perform CRUD operations in MVC application using EntityFramework’s database first approach,next article will focus on my favourite CodeFirst approach J.
Happy Coding.



Share/Bookmark