http://blog.csdn.net/leftfist/article/details/25005307

我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能。以往用过一些ORM方法,尽管有代码生成器,但代码量总的 来说比较多。这次采用EF,我就想,能不能尽量写出一些通用的方法,以后添加表、实体类,只需做很少的改动,就能拥有基本的增删改查功能呢?

方案如下:

1、 分为几个部分:BLL、DAL、Model、Interface。其中,EF生成的代码放在Model。因为不想由BLL直接操作Model,因此还是增 加一个DAL,由它来对EF的方法作进一步的封装,供BLL调用。至于接口,则是出于如下考虑:增删改查,BLL和DAL都需要实现,因此它们最好实现同 一接口;最重要的,因为使用了接口,在BLL中,方便调用DAL对象。

这几个部分分别介绍如下:

1、接口Interface

  1. public interface IEntity
  2. {
  3. long _ID { get;}
  4. }
  1. public interface ICommon<T> where T : class,IEntity
  2. {
  3. T Add(T model);
  4. T Update(T model);
  5. void Delete(T model);
  6. //按主键删除,keyValues是主键值
  7. void Delete(params object[] keyValues);
  8. //keyValues是主键值
  9. T Find(params object[] keyValues);
  10. List<T> FindAll();
  11. }

2、DAL

通用的增删改查代码:

  1. public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity
  2. {
  3. DbContext db;
  4. public BaseCommon(DbContext context)
  5. {
  6. this.db = context;
  7. }
  8. public DbContext Context
  9. {
  10. get
  11. {
  12. return db;
  13. }
  14. }
  15. #region ICommon<T>
  16. public T Add(T model)
  17. {
  18. db.Set<T>().Add(model);
  19. db.SaveChanges();
  20. return model;
  21. }
  22. public T Update(T model)
  23. {
  24. if (db.Entry<T>(model).State == EntityState.Modified)
  25. {
  26. db.SaveChanges();
  27. }
  28. else if (db.Entry<T>(model).State == EntityState.Detached)
  29. {
  30. try
  31. {
  32. db.Set<T>().Attach(model);
  33. db.Entry<T>(model).State = EntityState.Modified;
  34. }
  35. catch (InvalidOperationException)
  36. {
  37. T old = Find(model._ID);
  38. db.Entry(old).CurrentValues.SetValues(model);
  39. }
  40. db.SaveChanges();
  41. }
  42. return model;
  43. }
  44. public void Delete(T model)
  45. {
  46. db.Set<T>().Remove(model);
  47. db.SaveChanges();
  48. }
  49. public void Delete(params object[] keyValues)
  50. {
  51. T model = Find(keyValues);
  52. if (model != null)
  53. {
  54. db.Set<T>().Remove(model);
  55. db.SaveChanges();
  56. }
  57. }
  58. public T Find(params object[] keyValues)
  59. {
  60. return db.Set<T>().Find(keyValues);
  61. }
  62. public List<T> FindAll()
  63. {
  64. return db.Set<T>().ToList();
  65. }
  66. #endregion
  67. }

这里面,已经封装好了一般的增删改查方法。而对应数据库每个表对象的那些类,只需继承这个BaseCommon类,即可拥有增删改查功能。如:

  1. public partial class TableA : BaseCommon<Model.TableA> { }

这样,TableA对象会自然拥有增删改查功能。假如需要扩充它的功能,我们可以再写一个TableA的分部类。

以后,新增一个表TableB,在DAL这里,一般情况下只需新增一句:

  1. public partial class TableB : BaseCommon<Model.TableB> { }

是不是很方便?

3、BLL

BLL是供UI层,或者上一层调用的,因此,它每个对象,也应该有增删改查的基本功能。当然,BLL无须直接实现,是通过调用DAL来实现:

  1. public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>
  2. where TDAL : class ,new()
  3. where TModel : class ,Interface.IEntity
  4. {
  5. protected TDAL dal;
  6. private Interface.ICommon<TModel> common;
  7. public Common()
  8. {
  9. dal = new TDAL();
  10. common = (Interface.ICommon<TModel>)dal;
  11. }
  12. #region ICommon<TModel>
  13. public TModel Add(TModel model)
  14. {
  15. return common.Add(model);
  16. }
  17. public TModel Update(TModel model)
  18. {
  19. return common.Update(model);
  20. }
  21. public void Delete(TModel model)
  22. {
  23. common.Delete(model);
  24. }
  25. public void Delete(params object[] keyValues)
  26. {
  27. common.Delete(keyValues);
  28. }
  29. public TModel Find(params object[] keyValues)
  30. {
  31. return common.Find(keyValues);
  32. }
  33. public List<TModel> FindAll()
  34. {
  35. return common.FindAll();
  36. }
  37. #endregion
  38. }

与DAL类似,TableA对象在这里是这样的:

  1. public partial class TableA : Common<DAL.TableA, Model.TableA> { }

同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。

这里还有一个好处,就是对外界调用而言,根本不需要知道泛型,就是一个 TableA table = new TalbeA();就可以了。

EF学习笔记——通用增删改查方案的更多相关文章

  1. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

  2. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

  3. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

  4. Mybatis学习笔记3 - 增删改查示例

    1.接口定义 package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper { ...

  5. 学习笔记: mysql增删改查基础语句

    mysql基础入门语句 增: INSERT INTO 表名(字段1, 2, 3) VALUES('值1', '2', '3') 删: DELETE FROM 表明 WHERE 删除条件 不提供更新条件 ...

  6. MongoDB学习笔记—03 增删改查操作

    MongoDB的CURD操作分别通过函数insert().update().find().remove()进行 MongoDB文档新增与删除 MongoDB中关于文档的新增与删除比较简单.主要通过in ...

  7. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  8. PHP操作xml学习笔记之增删改查(2)—删、改、查

    xml文件 <?xml version="1.0" encoding="utf-8"?><班级>    <学生>       ...

  9. PHP操作xml学习笔记之增删改查(1)—增加

    xml文件 <?xml version="1.0" encoding="utf-8"?><班级>    <学生>       ...

随机推荐

  1. nginx反向代理实现跨域请求

    nginx反向代理实现跨域请求 跨域请求可以通过JSONP实现,缺点是需要修改被请求的服务器端代码进行配合,稍显麻烦通过在自己服务器上配置nginx的反向代理,可以轻松实现跨域请求 思路 示例服务器A ...

  2. windows目录选择 文件选择 文件保存对话框

    打开文件对话框 const char pszFilter[] = _T("EXE File (*.txt)|*.txt|All Files (*.*)|*.*||"); CFile ...

  3. 【bzoj1798】维护序列

    线段树维护两个标记. *0的操作在实质上没有任何影响. #include <cstdio> #include <cctype> #define rep(i,a,b) for ( ...

  4. 用c语言编写二分查找法

    二分法的适用范围为有序数列,这方面很有局限性. #include<stdio.h> //二分查找法 void binary_search(int a[],int start,int mid ...

  5. iOS7中的ViewController切换

    转自:https://onevcat.com/2013/10/vc-transition-in-ios7/ iOS 7 SDK之前的VC切换解决方案 在深入iOS 7的VC切换效果的新API实现之前, ...

  6. javascript错误处理与调试(转)

    JavaScript 在错误处理调试上一直是它的软肋,如果脚本出错,给出的提示经常也让人摸不着头脑. ECMAScript 第 3 版为了解决这个问题引入了 try...catch 和 throw 语 ...

  7. HTML5的 2D SVG和SVG DOM的学习笔记(2)---SVG动画

    SVG支持动画.可以通过以下几种方法获得动画效果: 使用SVG动画元素.SVG可以描述随时间变化的图形对象,使用不同的动画元素可以定义运动路径,淡入淡出效果和对象的膨胀.收缩.旋转和变换颜色. 使用S ...

  8. ReferentialConstraint 中的依赖属性映射到由存储生成的列

    ReferentialConstraint 中的依赖属性映射到由存储生成的列 这个问题是由于从表中的外键关系建立错误(可能是由于误改),查看从表的所有外键关系,即可找到问题所在. 问题: 什么是从表? ...

  9. shell脚本参数

    举例说:脚本名称叫test.sh 入参三个: 1 2 3运行test.sh 1 2 3后$*为"1 2 3"(一起被引号包住)$@为"1" "2&qu ...

  10. WCF初探-21:WCF终结点(endpoint)

    WCF终结点概述 在之前文章的示例中,我们都是通过配置服务的终结点(endpoint)发布的服务,供客户端调用,这是因为WCF服务的所有通信都是通过该服务的终结点进行的.每个终结点(endpoint) ...