博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework泛型封装
阅读量:7077 次
发布时间:2019-06-28

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

Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口,设计模式都用的眼花缭乱,我闲来没事就搞个简单的封装Helper,Github上也有关于EF的扩展Libray,具体没有用过,公司的有自己的封装,自己也没怎么弄,具体地址:https://github.com/loresoft/EntityFramework.Extended.

首先来看段代码,model和context是从数据中直接生成,你可以选择自己习惯的方式:

//新增            User addUser = new User();            addUser.PersonID = 3;            addUser.UserName = "keso";            dbContext.Entry
(addUser).State = EntityState.Added; dbContext.SaveChanges(); //修改 User updateUser = new User(); dbContext.Users.Where(item => item.ID == 2).OrderBy(item => item.ID); updateUser.UserName = updateUser.UserName + "测试"; dbContext.Entry
(updateUser).State = EntityState.Modified; dbContext.SaveChanges(); //删除 User delUser = dbContext.Users.Where(item => item.ID == 2).First(); dbContext.Entry
(delUser).State = EntityState.Deleted; dbContext.SaveChanges();

 如果每个业务实体都这么写一遍,估计公司水准有待提高,而且开发的也该跳起来骂人,本人只是简单封装下新建一个EFHelper,实际开发会封装的更多,不过底层处理是不变的

class EFHelpler
where T : class { //... }

 新增

方法:

///         /// 实体新增        ///         ///         public void add(params T[] paramList)        {            foreach (var model in paramList)            {                dbContext.Entry
(model).State = EntityState.Added; } dbContext.SaveChanges(); }

 调用:

EFHelpler
helper = new EFHelpler
(); BaseContext dbContext = new BaseContext(); //新增 List
listUser = new List
(); for (int i = 0; i < 2; i++) { User user = new User(); user.PersonID = i; user.UserName = "FlyElehant" + i; listUser.Add(user); } helper.add(listUser.ToArray()); Console.WriteLine("新增成功");

 查询

查询分了两种,一种是简单的查询,一种是分页的:

///         /// 实体查询        ///         public IEnumerable
getSearchList(System.Linq.Expressions.Expression
> where) { return dbContext.Set
().Where(where); } ///
/// 实体分页查询 /// ///
///
///
///
///
///
public IEnumerable
getSearchListByPage
(Expression
> where, Expression
> orderBy, int pageSize, int pageIndex) { return dbContext.Set
().Where(where).OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize); }

 简单调用,第二个方式除了分页之外,主要是查询的时候指定一定OrderBy的类型,也就是TKey:

var query = helper.getSearchList(item => item.UserName.Contains("keso"));            var queryMulti = helper.getSearchListByPage
(item => item.UserName.Contains("FlyElehant"), order => order.PersonID, 2, 1); query = queryMulti; foreach (User user in query) { Console.WriteLine(user.UserName); }

 修改

修改代码稍微读了几行,主要是用到了一下反射:

///         /// 按照条件修改数据        ///         ///         ///         public void update(Expression
> where, Dictionary
dic) { IEnumerable
result = dbContext.Set
().Where(where).ToList(); Type type = typeof(T); List
propertyList = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList(); //遍历结果集 foreach (T entity in result) { foreach (PropertyInfo propertyInfo in propertyList) { string propertyName = propertyInfo.Name; if (dic.ContainsKey(propertyName)) { //设置值 propertyInfo.SetValue(entity, dic[propertyName], null); } } } dbContext.SaveChanges(); }

 调用:

Dictionary
dic=new Dictionary
(); dic.Add("PersonID",2); dic.Add("UserName","keso"); helper.update(item => item.UserName.Contains("keso"), dic); Console.WriteLine("修改成功");

删除

方法:

///         /// 实体删除        ///         ///         public void delete(params T[] paramList)        {            foreach (var model in paramList)            {                dbContext.Entry
(model).State = EntityState.Deleted; } dbContext.SaveChanges(); }

  调用:

var query = helper.getSearchList(item => item.UserName.Contains("keso"));            helper.delete(query.ToArray());

 完整的EFHelper:

class EFHelpler
where T : class { BaseContext dbContext = new BaseContext(); ///
/// 实体新增 /// ///
public void add(params T[] paramList) { foreach (var model in paramList) { dbContext.Entry
(model).State = EntityState.Added; } dbContext.SaveChanges(); } ///
/// 实体查询 /// public IEnumerable
getSearchList(System.Linq.Expressions.Expression
> where) { return dbContext.Set
().Where(where); } ///
/// 实体分页查询 /// ///
///
///
///
///
///
public IEnumerable
getSearchListByPage
(Expression
> where, Expression
> orderBy, int pageSize, int pageIndex) { return dbContext.Set
().Where(where).OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize); } ///
/// 实体删除 /// ///
public void delete(params T[] paramList) { foreach (var model in paramList) { dbContext.Entry
(model).State = EntityState.Deleted; } dbContext.SaveChanges(); } ///
/// 按照条件修改数据 /// ///
///
public void update(Expression
> where, Dictionary
dic) { IEnumerable
result = dbContext.Set
().Where(where).ToList(); Type type = typeof(T); List
propertyList = type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList(); //遍历结果集 foreach (T entity in result) { foreach (PropertyInfo propertyInfo in propertyList) { string propertyName = propertyInfo.Name; if (dic.ContainsKey(propertyName)) { //设置值 propertyInfo.SetValue(entity, dic[propertyName], null); } } } dbContext.SaveChanges(); } }

 个人Demo难免有表达不当或者技术失误的地方,如有不当,请多多指出,感激不尽~

转载地址:http://cnpml.baihongyu.com/

你可能感兴趣的文章
Upgrade Guide
查看>>
HDU2929 Bigger is Better[DP 打印方案 !]
查看>>
Atitit.会员卡(包括银行卡)api的设计
查看>>
jquery.form.js+jquery.validation.js实现表单校验和提交
查看>>
装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接...
查看>>
微信小程序 - 更改button状态
查看>>
Hlacon 之Image ,Region,XLD
查看>>
js和jquery获取父级元素、子级元素、兄弟元素的方法
查看>>
国外程序员整理的 C++ 资源大全
查看>>
Git的杀手级功能之 一 远程仓库
查看>>
7-07. PAT排名汇总(25) (结构体 ZJU_PAT)
查看>>
初探flow.js
查看>>
【Android】Android中如何取消调转界面后EditText默认获取聚焦问题
查看>>
Jvm(45),指令集----类型转换指令
查看>>
前端学习-jQuery-2
查看>>
(轉載)教你怎样快速DIY自己的博客园SKIN
查看>>
SQL Server中关于基数估计如何计算预估行数的一些探讨
查看>>
用bochs调试自己写的系统引导代码
查看>>
svn的基线划分与管理
查看>>
黄连解毒汤治疗月经过多
查看>>