Entity Framework泛型封装
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<User>(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<User>(updateUser).State = EntityState.Modified;
dbContext.SaveChanges();
//删除
User delUser = dbContext.Users.Where(item => item.ID == 2).First();
dbContext.Entry<User>(delUser).State = EntityState.Deleted;
dbContext.SaveChanges();
如果每个业务实体都这么写一遍,估计公司水准有待提高,而且开发的也该跳起来骂人,本人只是简单封装下新建一个EFHelper,实际开发会封装的更多,不过底层处理是不变的
class EFHelpler<T> where T : class
{
//...
}
新增
方法:
/// <summary>
/// 实体新增
/// </summary>
/// <param name="model"></param>
public void add(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Added;
}
dbContext.SaveChanges();
}
调用:
EFHelpler<User> helper = new EFHelpler<User>();
BaseContext dbContext = new BaseContext();
//新增
List<User> listUser = new List<User>();
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("新增成功");
查询
查询分了两种,一种是简单的查询,一种是分页的:
/// <summary>
/// 实体查询
/// </summary>
public IEnumerable<T> getSearchList(System.Linq.Expressions.Expression<Func<T, bool>> where)
{
return dbContext.Set<T>().Where(where);
}
/// <summary>
/// 实体分页查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="where"></param>
/// <param name="orderBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <returns></returns>
public IEnumerable<T> getSearchListByPage<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)
{
return dbContext.Set<T>().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<int>(item => item.UserName.Contains("FlyElehant"), order => order.PersonID, 2, 1);
query = queryMulti;
foreach (User user in query)
{
Console.WriteLine(user.UserName);
}
修改
修改代码稍微读了几行,主要是用到了一下反射:
/// <summary>
/// 按照条件修改数据
/// </summary>
/// <param name="where"></param>
/// <param name="dic"></param>
public void update(Expression<Func<T, bool>> where, Dictionary<string, object> dic)
{
IEnumerable<T> result = dbContext.Set<T>().Where(where).ToList();
Type type = typeof(T);
List<PropertyInfo> 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<string,object> dic=new Dictionary<string,object>();
dic.Add("PersonID",2);
dic.Add("UserName","keso");
helper.update(item => item.UserName.Contains("keso"), dic);
Console.WriteLine("修改成功");
删除
方法:
/// <summary>
/// 实体删除
/// </summary>
/// <param name="model"></param>
public void delete(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Deleted;
}
dbContext.SaveChanges();
}
调用:
var query = helper.getSearchList(item => item.UserName.Contains("keso"));
helper.delete(query.ToArray());
完整的EFHelper:
class EFHelpler<T> where T : class
{
BaseContext dbContext = new BaseContext();
/// <summary>
/// 实体新增
/// </summary>
/// <param name="model"></param>
public void add(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Added;
}
dbContext.SaveChanges();
}
/// <summary>
/// 实体查询
/// </summary>
public IEnumerable<T> getSearchList(System.Linq.Expressions.Expression<Func<T, bool>> where)
{
return dbContext.Set<T>().Where(where);
}
/// <summary>
/// 实体分页查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="where"></param>
/// <param name="orderBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <returns></returns>
public IEnumerable<T> getSearchListByPage<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)
{
return dbContext.Set<T>().Where(where).OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize);
} /// <summary>
/// 实体删除
/// </summary>
/// <param name="model"></param>
public void delete(params T[] paramList)
{
foreach (var model in paramList)
{
dbContext.Entry<T>(model).State = EntityState.Deleted;
}
dbContext.SaveChanges();
}
/// <summary>
/// 按照条件修改数据
/// </summary>
/// <param name="where"></param>
/// <param name="dic"></param>
public void update(Expression<Func<T, bool>> where, Dictionary<string, object> dic)
{
IEnumerable<T> result = dbContext.Set<T>().Where(where).ToList();
Type type = typeof(T);
List<PropertyInfo> 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难免有表达不当或者技术失误的地方,如有不当,请多多指出,感激不尽~
Entity Framework泛型封装的更多相关文章
- Entity Framework 泛型使用
因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了.我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类.那就要求我们的父类必须使用泛型来实现. ...
- .net entity framework 泛型 更新与增加记录
static public bool SaveOrUpdate<T>(T entity) where T: class { bool result = false; using (wech ...
- Entity Framework分页扩展
Entity Framework分页在我初入门时总是困扰这我,无论是SQL分页还是Entity Framework的分页,总是显得那么麻烦,因此对于Entity Framework单独封装了分页. 一 ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
- .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)
自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...
- (Entity framework 应用篇)把权限判断封装在数据库访问层
这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了 首先,先看看我数据库DBContext的定义 ...
- Entity Framework 与 面向对象
说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述 ...
- 3、ASP.NET MVC入门到精通——Entity Framework增删改查
这里我接上讲Entity Framework入门.从网上下载Northwind数据库,新建一个控制台程序,然后重新添加一个ado.net实体数据模型. EF中操作数据库的"网关"( ...
- Code First :使用Entity. Framework编程(5) ----转发 收藏
第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...
随机推荐
- iuap
2017.12 用友今年着力点往云平台发展,是时候整理一下思路 第一:iuap 第二:Linux 第三:财务会计业务入门 第四:NC节点视频教程--财务模块 2019年3月4日 all in iuap ...
- Windows Installer服务总是自动关闭导致无法安装在win10上安装英伟达显卡驱动的解决方案
你可以依次点击"开始→程序→附件→命令提示符",键入:msiexec /unregister, 然后再键入msiexec /regserver.应该就能解决. 更多的参考:How ...
- 见微知著(一):解析ctf中的pwn--Fast bin里的UAF
在网上关于ctf pwn的入门资料和writeup还是不少的,但是一些过渡的相关知识就比较少了,大部分赛棍都是在不断刷题中总结和进阶的.所以我觉得可以把学习过程中的遇到的一些问题和技巧总结成文,供大家 ...
- django中缓存配置
# ======缓存配置====== CACHES = { ## 虚拟缓存,开发调试版本,此为开始调试用,实际内部不做任何操作 # 'default': { # 'BACKEND': 'django. ...
- android 消息机制,handler机制,messageQueue,looper
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha handler 就是 处理器 . 用来处理消息, 发送消息. handler 就 ...
- 【UOJ #221】【NOI 2016】循环之美
http://uoj.ac/problem/221 因为\(a\)和\(b\)不互质时,\(\frac ab=\frac{\frac a{(a,b)}}{\frac b{(a,b)}}\),所以只用求 ...
- 牛可乐发红包脱单OI赛 C 小可爱表白
打个暴力查一下OEIS,5min做完 出题人一开始把式子打错了,一开始的式子的结果为$n * (n + 3) * 2^{n - 3}$ 我们考虑化式子 首先考虑 $\sum\limits_{j = 1 ...
- ksyun主机挂载ksyun硬盘
1.查看虚拟磁盘的设备号是 /dev/vdc ls /dev/vd*2.格式化块设备,强烈推荐ext4文件系统: mkfs.ext4 /dev/vdc 3.准备挂载点,建立挂载目录.例: mkdir ...
- bzoj 3956: Count
3956: Count Description Input Output Sample Input 3 2 0 2 1 2 1 1 1 3 Sample Output 0 3 HINT M,N< ...
- Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
Codeforces Round #297 (Div. 2)C. Ilya and Sticks Time Limit: 2 Sec Memory Limit: 256 MBSubmit: xxx ...