ntroducing K-Pattern: A Rapid Way to Make CRUD Operations with Entity Framework
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
HttpContextbasis 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
Collapse | Copy CodeCourse objCourse = new Course
{
Name = "B.Sc.",
Duration = "3 Years"
}; objCourse.Save();
Insert Parent & Insert Children
Collapse | Copy CodeCourse objCourse = new Course
{
Name = "M.Sc.",
Duration = "3 Years"
}; objCourse.AttachMe(); // Here we attached the current object with entity object context to perform operations on children entities objCourse.Students.Add(new Student { Name = "John", FName = "David" });
objCourse.Students.Add(new Student { Name = "Bob", FName = "Jason" }); objCourse.Save();
Update Parent & Insert Children
Collapse | Copy CodeCourse objCourse = Course.GetCourse(2); // Get MCA Cource
objCourse.Students.Add(new Student { Name = "Niroo", FName = "Rob" });
objCourse.Students.Add(new Student { Name = "Chirs", FName = "William" });
objCourse.Save();
Update Parent & Update Children
Collapse | Copy CodeCourse objCourse = Course.GetCourse(2); // Get MCA Course 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
Collapse | Copy CodeCourse objCourse = Course.GetCourse(4); // Get M-Tech Course objCourse.Duration = "4 Years";
objCourse.Students.AttachUs(Operation.Delete); // Attach student with context and change the EntityState to Deleted objCourse.Save();
Delete Parent & Delete Children
Collapse | Copy CodeCourse objCourse = Course.GetCourse(3); // Get B-Tech Course objCourse.Students.AttachUs(Operation.Delete); // Attach student with context and change the EntityState to Deleted 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.
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
ntroducing K-Pattern: A Rapid Way to Make CRUD Operations with Entity Framework的更多相关文章
- Using the Repository Pattern with ASP.NET MVC and Entity Framework
原文:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-and ...
- [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework
本文转自:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-a ...
- Generic repository pattern and Unit of work with Entity framework
原文 Generic repository pattern and Unit of work with Entity framework Repository pattern is an abstra ...
- Using Repository Pattern in Entity Framework
One of the most common pattern is followed in the world of Entity Framework is “Repository Pattern”. ...
- IMPLEMENTATION - Entity Framework Anti Pattern - High Performance EF
Good about ORM Developer is free from building T-Sql on the database tier which is not their major a ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
随机推荐
- .com .cn .org .edu等域名的意义
在开发的时候遇到了.org的域名,后来就去查了一下,原来这种域名是非盈利组织或者协会的标志 比如: https://getcomposer.org/ https://packagist.org/ ht ...
- linux用rdate命令实现同步时间
用rdate命令实现同步时间 前两天说到用ntp时间服务器和ntpdate命令同步时间,今天简单记录下用rdate同步时间 http://blog.csdn.net/wyzxg/archive/201 ...
- 【转】Jmeter 代理服务器录制脚本
因为Badboy只支持IE浏览器,现在又不得不到到fireFox上录制脚本才能完成,再次重温下Jmeter自带的Http代理服务器,当然比起badboy,它稍稍麻烦点. 1 配置很简单 工作台--& ...
- Vue.js:监听属性
ylbtech-Vue.js:监听属性 1.返回顶部 1. Vue.js 监听属性 本章节,我们将为大家介绍 Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化: 实例 & ...
- xunsearch搜索使用
目录 如何开始搜索? 典型处理 快捷操作 搜索中的串接操作 构建搜索语句 如何开始搜索? <?php // 引入 require_once './sdk/xs/lib/XS.php'; // 创 ...
- 关于Unity发布iOS平台代码混淆问题
之前在越狱手机里找到<永恒战士3>的程序发现是用Unity做的,拷出资源出来看的时候发现里面有游戏程序集,立马抽出来反编译了一下,发现里面的代码只有方法签名,没有方法体,还以为用什么高端混 ...
- Centos7 SSH公钥生成及配置
1.你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" 2.按照提示完成三次回车,即可生成 ssh key.通过查 ...
- leetcode717
class Solution { public: bool isOneBitCharacter(vector<int>& bits) { int len = bits.size() ...
- cxf和axis2使用有感
CXF框架 个人不喜欢使用wsimport工具: 1.考虑到远端的服务接口发生变化,本地的接口还需要重新同步下 2.项目中无端多了些冗余的代码 这样我们选择cxf的动态调用接口吧,使用DynamicC ...
- for in 循环的输出顺序问题
var data = { '4': 'first', '3': 'second', '2': 'third', '1': 'fourth' }; for (var i in data) { conso ...