Introduction
Earlier in the last year I made a different approach to work on Entity Framework and in that I made some classes to handle the ObjectContext
in single request scope and some extension methods to handle Insert / Update / Delete for all the edmx designer classes. Using that way I realized that how fast we can make applications with it but there are some things which are missing on that way. I worked on those drawbacks and now it’s in front of you.
This article is a remake of my earlier Article/Tip "Best way to use Entity Framework". I’ll describe new features and methods of “Helper.cs”
class and will also compare this approach with some other approaches in the market in this article.
Background
Please go through the Part 1 before reading this article to understand the “Global Context” and “Helper” classes. After writing the 1st part, Debates were done among the developers that are is this the “Best way to use Entity Framework”? So to make it more understand it is best because of below things:
- DataContext alive and disposes on
HttpContext
basis so you do not need to write the code for initialize and dispose again and again in code blocks. - The Insert, Delete and Update methods are attached with Data Context Entity classes without any change effect in the original designer file. So developer does not need to write individual functions for these operations for each entity class.
- Single Method for Insert and Update.
- Easy and Fast to implement
However, there are some other patterns that also follow the same rule but there are lot of code involves to making it happen.
What's New?
The previous “Helper.cs” doesn’t allow Insert/Update/Delete operations on relational entities therefore It only works on Single Entity. This was the major drawback but now I have added some new methods to get overcome this issue. There is a new enum Operation
introduce to define EntitySet Operations like Added
, Modified
and Deleted
. New extension methods have been defined for three classes EntityObject, EntityCollection<T> and ObjectContext. The list of methods with their classes and signatures are mentioned below:
Class | Methods | Description |
EntityObject | AttachMe(this EntityObject objEntity) | Attach the current entity object with defined Global Context in Global.cs. |
AttachMe(this EntityObject objEntity, Operation oper) | Attach the current entity object with defined Global Context in Global.cs and Change its state according to the provided Operation enum |
DetachMe(this EntityObject entity) | Detach the current entity object with defined Global Context in Global.cs |
|
EntityCollection<T> | AttachUs<T>(this EntityCollection<T> entities, Operation oper) where T : EntityObject | Generic method to attach the whole collection with define Global Context in Global.cs |
DetachUs<T>(this EntityCollection<T> entities) where T : EntityObject | Generic method to attach the whole collection with define Global Context in Global.cs |
|
ObjectContext | AttachObject(this ObjectContext context, EntityObject objEntity) | Attach the provided entity with provided context. |
AttachObject(this ObjectContext context, EntityObject objEntity, Operation oper) | Attach the provided entity with provided context and change its state according the provided operation. |
DetachObject(this ObjectContext Context, EntityObject entity) | Detach the provided entity with provided context. |
Let's Get Started
To demonstrate the new methods, we are going to make a DB (db_EntityFrameworkSample)
and create two tables which have One to Many Relationship
between.
In above diagram there are two tables Course
and Student
and they are associated via One to Many Relationship
. We are going to perform operations on these tables in following order.
Single Entity Operations
Course objCourse = new Course
{
Name = "B.Sc.",
Duration = "3 Years"
};
objCourse.Save();
Insert Parent & Insert Children
Course objCourse = new Course
{
Name = "M.Sc.",
Duration = "3 Years"
};
objCourse.AttachMe();
objCourse.Students.Add(new Student { Name = "John", FName = "David" });
objCourse.Students.Add(new Student { Name = "Bob", FName = "Jason" });
objCourse.Save();
Update Parent & Insert Children
Course objCourse = Course.GetCourse(2);
objCourse.Students.Add(new Student { Name = "Niroo", FName = "Rob" });
objCourse.Students.Add(new Student { Name = "Chirs", FName = "William" });
objCourse.Save();
Update Parent & Update Children
Course objCourse = Course.GetCourse(2);
objCourse.Students.ElementAtOrDefault(0).BirthDate = new DateTime(1986, 12, 15);
objCourse.Students.ElementAtOrDefault(1).BirthDate = new DateTime(1990, 7, 15);
objCourse.Save();
Update Parent & Delete Children
Course objCourse = Course.GetCourse(4);
objCourse.Duration = "4 Years";
objCourse.Students.AttachUs(Operation.Delete);
objCourse.Save();
Delete Parent & Delete Children
Course objCourse = Course.GetCourse(3);
objCourse.Students.AttachUs(Operation.Delete);
objCourse.Delete();
Above are sample codes which define the data operations between Parent-Child entities with different combinations using "K-Pattern".
Comparision With Repository Pattern
Feature | K-Pattern | Repository Pattern |
Easy to implement | YES | NO |
Context Scope in Single Request | YES | YES (With IOC) |
Suitable Project Types | Small and Medium Types | Large Type |
Support for EF Approaches | Database First | Code First and Database First |
Conclusion
This is all about the K-Pattern. Thre are lot of discussion coming along with this approach and I'll be waiting for your reviews and suggestions to improve it better. Please downaload the source code, create the DB with the available SQL Script, chagne the conenction string and run it straight.
Thanks for reading. Happy coding.