博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF学习笔记——通用增删改查方案
阅读量:5811 次
发布时间:2019-06-18

本文共 3776 字,大约阅读时间需要 12 分钟。

我刚接触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
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
FindAll(); }

2、DAL

通用的增删改查代码:

public abstract class BaseCommon
: Interface.ICommon
where T : class,Interface.IEntity { DbContext db; public BaseCommon(DbContext context) { this.db = context; } public DbContext Context { get { return db; } } #region ICommon
public T Add(T model) { db.Set
().Add(model); db.SaveChanges(); return model; } public T Update(T model) { if (db.Entry
(model).State == EntityState.Modified) { db.SaveChanges(); } else if (db.Entry
(model).State == EntityState.Detached) { try { db.Set
().Attach(model); db.Entry
(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
().Remove(model); db.SaveChanges(); } public void Delete(params object[] keyValues) { T model = Find(keyValues); if (model != null) { db.Set
().Remove(model); db.SaveChanges(); } } public T Find(params object[] keyValues) { return db.Set
().Find(keyValues); } public List
FindAll() { return db.Set
().ToList(); } #endregion }
这里面,已经封装好了一般的增删改查方法。而对应数据库每个表对象的那些类,只需继承这个BaseCommon类,即可拥有增删改查功能。如:

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

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

public partial class TableB : BaseCommon
{ }
是不是很方便?

3、BLL

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

public abstract class Common
: Interface.ICommon
where TDAL : class ,new() where TModel : class ,Interface.IEntity { protected TDAL dal; private Interface.ICommon
common; public Common() { dal = new TDAL(); common = (Interface.ICommon
)dal; } #region ICommon
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
FindAll() { return common.FindAll(); } #endregion }
与DAL类似,TableA对象在这里是这样的:

public partial class TableA : Common
{ }
同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。

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

转载于:https://www.cnblogs.com/leftfist/p/4257923.html

你可能感兴趣的文章
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>
USNews大学排名遭美国计算机研究学会怒怼,指排名荒谬要求撤回
查看>>
struts1——静态ActionForm与动态ActionForm
查看>>
七大关键数据 移动安全迎来历史转折点
查看>>
在AngularJS中学习javascript的new function意义及this作用域的生成过程
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
1、下载安装scala编译器(可以理解为scala的jdk),地址:http://www.scala
查看>>
mui 总结2--新建第一个app项目
查看>>
nginx的lua api
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
HCNA——RIP的路由汇总
查看>>
zabbix监控php状态(四)
查看>>
定时任务的创建
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>
SSH中调用另一action的方法(chain,redirect)
查看>>