EF学习笔记——通用增删改查方案
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
- public interface IEntity
- {
- long _ID { get;}
- }
- public interface ICommon<T> where T : class,IEntity
- {
- T Add(T model);
- T Update(T model);
- void Delete(T model);
- //按主键删除,keyValues是主键值
- void Delete(params object[] keyValues);
- //keyValues是主键值
- T Find(params object[] keyValues);
- List<T> FindAll();
- }
2、DAL
通用的增删改查代码:
- public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity
- {
- DbContext db;
- public BaseCommon(DbContext context)
- {
- this.db = context;
- }
- public DbContext Context
- {
- get
- {
- return db;
- }
- }
- #region ICommon<T>
- public T Add(T model)
- {
- db.Set<T>().Add(model);
- db.SaveChanges();
- return model;
- }
- public T Update(T model)
- {
- if (db.Entry<T>(model).State == EntityState.Modified)
- {
- db.SaveChanges();
- }
- else if (db.Entry<T>(model).State == EntityState.Detached)
- {
- try
- {
- db.Set<T>().Attach(model);
- db.Entry<T>(model).State = EntityState.Modified;
- }
- catch (InvalidOperationException)
- {
- T old = Find(model._ID);
- db.Entry(old).CurrentValues.SetValues(model);
- }
- db.SaveChanges();
- }
- return model;
- }
- public void Delete(T model)
- {
- db.Set<T>().Remove(model);
- db.SaveChanges();
- }
- public void Delete(params object[] keyValues)
- {
- T model = Find(keyValues);
- if (model != null)
- {
- db.Set<T>().Remove(model);
- db.SaveChanges();
- }
- }
- public T Find(params object[] keyValues)
- {
- return db.Set<T>().Find(keyValues);
- }
- public List<T> FindAll()
- {
- return db.Set<T>().ToList();
- }
- #endregion
- }
这里面,已经封装好了一般的增删改查方法。而对应数据库每个表对象的那些类,只需继承这个BaseCommon类,即可拥有增删改查功能。如:
- public partial class TableA : BaseCommon<Model.TableA> { }
这样,TableA对象会自然拥有增删改查功能。假如需要扩充它的功能,我们可以再写一个TableA的分部类。
以后,新增一个表TableB,在DAL这里,一般情况下只需新增一句:
- public partial class TableB : BaseCommon<Model.TableB> { }
是不是很方便?
3、BLL
BLL是供UI层,或者上一层调用的,因此,它每个对象,也应该有增删改查的基本功能。当然,BLL无须直接实现,是通过调用DAL来实现:
- public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>
- where TDAL : class ,new()
- where TModel : class ,Interface.IEntity
- {
- protected TDAL dal;
- private Interface.ICommon<TModel> common;
- public Common()
- {
- dal = new TDAL();
- common = (Interface.ICommon<TModel>)dal;
- }
- #region ICommon<TModel>
- public TModel Add(TModel model)
- {
- return common.Add(model);
- }
- public TModel Update(TModel model)
- {
- return common.Update(model);
- }
- public void Delete(TModel model)
- {
- common.Delete(model);
- }
- public void Delete(params object[] keyValues)
- {
- common.Delete(keyValues);
- }
- public TModel Find(params object[] keyValues)
- {
- return common.Find(keyValues);
- }
- public List<TModel> FindAll()
- {
- return common.FindAll();
- }
- #endregion
- }
与DAL类似,TableA对象在这里是这样的:
- public partial class TableA : Common<DAL.TableA, Model.TableA> { }
同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。
这里还有一个好处,就是对外界调用而言,根本不需要知道泛型,就是一个 TableA table = new TalbeA();就可以了。
EF学习笔记——通用增删改查方案的更多相关文章
- 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
- MongoDB学习笔记,基础+增删改查+索引+聚合...
一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...
- Mybatis学习笔记3 - 增删改查示例
1.接口定义 package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper { ...
- 学习笔记: mysql增删改查基础语句
mysql基础入门语句 增: INSERT INTO 表名(字段1, 2, 3) VALUES('值1', '2', '3') 删: DELETE FROM 表明 WHERE 删除条件 不提供更新条件 ...
- MongoDB学习笔记—03 增删改查操作
MongoDB的CURD操作分别通过函数insert().update().find().remove()进行 MongoDB文档新增与删除 MongoDB中关于文档的新增与删除比较简单.主要通过in ...
- SqlServer存储过程学习笔记(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- PHP操作xml学习笔记之增删改查(2)—删、改、查
xml文件 <?xml version="1.0" encoding="utf-8"?><班级> <学生> ...
- PHP操作xml学习笔记之增删改查(1)—增加
xml文件 <?xml version="1.0" encoding="utf-8"?><班级> <学生> ...
随机推荐
- 软件测试--测试Demo
视频地址(第二课时):https://pan.baidu.com/s/1gfLVC2n 软件安装好了! 软件默认的浏览器是火狐. 如果需要IE,chrome,都在前一篇的安装包里有. 测试结果 视频里 ...
- win7文件夹图标中多了一把小锁打不开文件夹怎么办?
win7文件夹图标中多了一把小锁打不开文件夹怎么办?解决办法一:右击目录→取得管理员权限!该方法适用于win7旗舰版.解决办法二:右击目录→属性→安全→高级→选择everyone→更改权限→勾上完全访 ...
- EditText设置文字改变时的监听
textWatcher = new TextChangeWatcher(); etQuerryInfo.addTextChangedListener(textWatcher); /** * 文字改变类 ...
- ABAP字符串翻转
就这个函数STRING_REVERSE 略显蛋疼,好搞那么复杂.... 简单的转换嘛: FUNCTION ZSTRING_REVERSE. *"----------------------- ...
- 什么是Angular? 我们为什么要学习它?
在我更新Ionic的时候有人问我什么是 Angular,我们为什么要学习它啊?这个是我的疏忽了,在没有告诉你们什么是 Angular 的时候就让大家着手去学习 Ionic .那么今天就让我们认识一下什 ...
- PostgreSQL 列出所有表名和数据库名
列出表名 直接 \d 不加参数 或 SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' ...
- GitHub Pages 搭建流程-基于jekyll-bootstrap
我写这篇文章的目的是记录本博客的搭建过程,自己从零开始逐步搭建起来了GitHub Pages,其中借鉴了很多的博客和模版,稍后会在后面列出,也为没有用过gihub和jekyll的童鞋提供一点帮助. 学 ...
- hdu 1057 (simulation, use sentinel to avoid boudary testing, use swap trick to avoid extra copy.) 分类: hdoj 2015-06-19 11:58 25人阅读 评论(0) 收藏
use sentinel to avoid boudary testing, use swap trick to avoid extra copy. original version #include ...
- 初学者SQL语句介绍
初学者SQL语句介绍 1.用 Select 子句检索记录 Select 子句是每一个检索数据的查询核心.它告诉数据库引擎返回什么字段. Select 子句的常见形式是: S ...
- Request.Form()的使用
在CS文件中获得对应页面中的下拉框DropDownList_sitebranch值可以有以下几种方法获得: siteInfo.FZJGID = DropDownList_sitebra ...