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 AddedModified and Deleted. New extension methods have been defined for three classes EntityObjectEntityCollection<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 Code
Course objCourse = new Course
{
Name = "B.Sc.",
Duration = "3 Years"
}; objCourse.Save();

Insert Parent & Insert Children

 Collapse | Copy Code
Course 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 Code
Course 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 Code
Course 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 Code
Course 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 Code
Course 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的更多相关文章

  1. 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 ...

  2. [转]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 ...

  3. 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 ...

  4. Using Repository Pattern in Entity Framework

    One of the most common pattern is followed in the world of Entity Framework is “Repository Pattern”. ...

  5. 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 ...

  6. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  7. 在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  8. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  9. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

随机推荐

  1. 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT

    题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...

  2. BZOJ4755:[JSOI2016]扭动的回文串

    浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://lydsy.com/JudgeOnline/pro ...

  3. Maven构建跳过测试步骤

    有时候我们不想再执行maven的package或者install命令时每次都执行test,那么可以在pom.xml里的build->pluginManagement->plugins新增如 ...

  4. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

  5. Delphi从Internet下载文件

    Delphi从Internet下载文件   今天在做拍卖系统的时候,因考虑到网络状况问题,需要将拍品所有信息下载到本机,包括拍品图片,因此需要实现从Internet下载文件的功能.      下面是代 ...

  6. php单链表实现

    php单链表实现 <?php //单链表 class Hero{ public $no; public $name; public $nickname; public $next=null; f ...

  7. java.控制次数,每一组数都要计算。所以有个嵌套

    总结:数组内的数据要循环,外面的次数也要循环 package com.aini; import java.util.Scanner; //要求可以控制输入的次数,比如4次.则输入5个数,5组输出结果 ...

  8. zufeoj 分数线划定

    分数线划定 时间限制: 1 Sec  内存限制: 128 MB提交: 13  解决: 7[提交][状态][讨论版] 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行.为了选拔最合适的人才,A ...

  9. IDA Pro 权威指南学习笔记(七) - 其他 IDA 显示窗口

    默认情况下 IDA 不会打开这些窗口,可通过 View -> Open Subviews 命令打开 Strings 窗口(Strings) Strings 窗口中显示的是从二进制文件中提取出的一 ...

  10. STM32用有源蜂鸣器实现闹钟的声响

    有源蜂鸣器的声音是固定的,工作电压恒定,改变通断电的时间获得不同时长的音响,譬如连续音.快速短音.慢速长音(类似莫尔斯电报)来区分不同的报警信息. 简单的说,有源蜂鸣器只能发出一种声音,因为它的频率是 ...