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难免有表达不当或者技术失误的地方,如有不当,请多多指出,感激不尽~

EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuicool的更多相关文章

  1. Oracle,Sql,procedure 感觉自己写的很棒的一个存储过程

    感觉自己写的很棒的一个Oracle存储过程,(其实想说很叼^,^). 集成了一堆操作数据的功能(至少几十), 包括存储过程执行异常信息输出帮助诊断. 亮点很多, 比如`over(partition b ...

  2. 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?

    在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...

  3. 说明你javascript写的很烂的5个问题

    Javascript在互联网上名声很臭,但你又很难再找到一个像它这样如此动态.如此被广泛使用.如此根植于我们的生活中的另外一种语言.它的低学习门槛让很多人都称它为学前脚本语言,它另外一个让人嘲笑的东西 ...

  4. java面试必备知识点-上中下三篇写的很详细

    参考博客:写的还是相当的经典 http://www.cnblogs.com/absfree/p/5568849.html 上中下三篇写的很详细 http://blog.csdn.net/riverfl ...

  5. mybatis写当天 当月的数据 时间段数据https://www.cnblogs.com/xzjf/p/7600533.html

    mybatis写当天 当月的数据 时间段数据----https://www.cnblogs.com/xzjf/p/7600533.html

  6. 吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个javabean之间的相互拷贝,自己写的就当是研究咯---https://www.cnblogs.com/NieXiaoHui/p/7150928.html

    吧,其实spring自带的BeanUtils就有这样的功能,引入spring-beans和spring-core之后,就有BeanUtils.copyProperties(a, b);可以实现两个ja ...

  7. DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)

    /DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属性 ...

  8. Entity Framework泛型封装

    Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口, ...

  9. 这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框架的时候。

    一.什么是泛型 泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能. 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样.但我们没有办法,只能分别写多个方法 ...

随机推荐

  1. oracle任务计划debug

    crontab -eno crontab for root - using an empty onecrontab: installing new crontab"/tmp/crontab. ...

  2. try,catch捕获错误的用法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script&g ...

  3. find the mincost route(最小环,最短路,floyd)

    find the mincost route Time Limit: 1000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. 自己定义View常处理的回调函数

    onFinishInflate() 当View中全部的子控件均被映射成xml后触发 onMeasure(int, int) 确定全部子元素的大小 onLayout(boolean, int, int, ...

  5. dataset 用法(2)

    1.为DataTable添加列 (1)添加列 DataTable  tbl = ds.Tables.Add("User"); DataColumn col =tbl.Columns ...

  6. 跟我一起学写jQuery插件开发方法(转载)

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧!     很 ...

  7. UISearchBar总结

    UISearchBar介绍 属性 作用 UIBarStyle barStyle 控件的样式 id delegate 设置控件的委托 NSString *text 控件上面的显示的文字 NSString ...

  8. 小鱼提问1 类中嵌套public修饰的枚举,外部访问的时候却只能Class.Enum这样访问,这是为何?

    /// <summary> /// 常量等定义 /// </summary> public class General { /// <summary> /// 文件 ...

  9. java——String的那边破事

    经典的先看下面一段代码,请问最终创建几个对象,分别在哪里? String s0 = new String("luoliang.me"); String s1 = "luo ...

  10. 新视野OJ 2705 [SDOI2012]Longge的问题 (数论)

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 题解:求 sigma(gcd(i,n), 1<=i<=n<2^32) ...