Entity Framework 泛型使用

因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了。我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类。那就要求我们的父类必须使用泛型来实现。

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data.Entity.Infrastructure;
  4 using System.Linq;
  5 using System.Linq.Expressions;
  6 using System.Reflection;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9
 10 namespace ConsoleApplication1
 11 {
 12     /// <summary>
 13     /// 定义泛型,必须规定T为类,不然db.Set<T>会报错
 14     /// </summary>
 15     /// <typeparam name="T"></typeparam>
 16     class DALBase<T> where T:class
 17     {
 18         //因为我们要操作数据库,所以先实例化一个上下文
 19         Model1Container db = new Model1Container();
 20
 21         #region 添加方法
 22         /// <summary>
 23         /// 添加方法
 24         /// </summary>
 25         /// <param name="Model"></param>
 26         public void add(T Model)
 27         {
 28             db.Set<T>().Add(Model);
 29             db.SaveChanges();
 30         }
 31         #endregion
 32
 33         #region 修改单个实体
 34         /// <summary>
 35         /// 修改单个实体
 36         /// </summary>
 37         /// <param name="Model"></param>
 38         /// <param name="strs"></param>
 39         public void update(T Model, params string[] strs)
 40         {
 41             DbEntityEntry entry = db.Entry<T>(Model);
 42             entry.State = System.Data.EntityState.Unchanged;
 43             foreach (string tempStr in strs)
 44             {
 45                 entry.Property(tempStr).IsModified = true;
 46             }
 47             db.SaveChanges();
 48         }
 49         #endregion
 50
 51         #region 批量修改,根据反射,稍微要复杂一些
 52         /// <summary>
 53         /// 批量修改,根据反射,稍微要复杂一些
 54         /// </summary>
 55         /// <param name="Model">将值存入属性中</param>
 56         /// <param name="where">批量修改的条件</param>
 57         /// <param name="strs">属性</param>
 58         public void updateBatch(T Model, Expression<Func<T, bool>> where, params string[] strs)
 59         {
 60             //先根据条件查出符合要修改的集合
 61             List<T> tempList = db.Set<T>().Where(where).ToList();
 62             //获取类型
 63             Type t = typeof(T);
 64             //利用反射获取T类型public属性集合
 65             List<PropertyInfo> tempPro = t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList();
 66             Dictionary<string, PropertyInfo> propertyDic = new Dictionary<string, PropertyInfo>();
 67             //遍历T的所有属性,将符合修改的存入字典中
 68             tempPro.ForEach(p => { if (strs.Contains(p.Name)) { propertyDic.Add(p.Name, p); } });
 69             //遍历要修改的属性
 70             foreach (string str in strs)
 71             {
 72                 if (propertyDic.ContainsKey(str))
 73                 {
 74                     PropertyInfo propertyInfo = propertyDic[str];
 75                     //获取要修改属性的值
 76                     object value = propertyInfo.GetValue(Model, null);
 77                     foreach (T tempData in tempList)
 78                     {
 79                         //设置值
 80                         propertyInfo.SetValue(tempData, value, null);
 81                     }
 82                 }
 83             }
 84         }
 85         #endregion
 86
 87         #region 根据实体id删除操作
 88         /// <summary>
 89         /// 根据实体id删除操作
 90         /// </summary>
 91         /// <param name="Model"></param>
 92         public void remove(T Model)
 93         {
 94             db.Set<T>().Attach(Model);
 95             db.Set<T>().Remove(Model);
 96             db.SaveChanges();
 97         }
 98         #endregion
 99
100         #region 根据条件删除操作
101         /// <summary>
102         /// 根据条件删除操作
103         /// </summary>
104         /// <param name="remWhere"></param>
105         public void removeByWhere(Expression<Func<T, bool>> remWhere)
106         {
107             List<T> tempList = db.Set<T>().Where(remWhere).ToList();
108             tempList.ForEach(t => { db.Set<T>().Attach(t); db.Set<T>().Remove(t); });
109             db.SaveChanges();
110         }
111         #endregion
112
113         #region 一般带条件查询
114         /// <summary>
115         /// 一般带条件查询
116         /// </summary>
117         /// <param name="where"></param>
118         /// <returns></returns>
119         public List<T> getList(System.Linq.Expressions.Expression<Func<T, bool>> where)
120         {
121             return db.Set<T>().Where(where).ToList();
122         }
123         #endregion
124
125         #region 带条件排序,页码页容量查询
126         /// <summary>
127         /// 带条件排序,页码页容量查询
128         /// </summary>
129         /// <typeparam name="TKey"></typeparam>
130         /// <param name="where"></param>
131         /// <param name="orderBy"></param>
132         /// <param name="pageSize"></param>
133         /// <param name="pageIndex"></param>
134         /// <returns></returns>
135         public List<T> getListOrder<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)
136         {
137             return db.Set<T>().Where(where).OrderBy(orderBy).Skip(pageIndex - 1).Take(pageSize).ToList();
138         }
139         #endregion
140     }
141 }

里面用到了反射,可能有些复杂,EF要告一段落了,下面开始记录mvc学习历程了。以后可能还会写个小项目,使用mvc+EF

Entity Framework 泛型使用,布布扣,bubuko.com

时间: 2024-10-09 23:55:11

Entity Framework 泛型使用的相关文章

Entity Framework泛型封装

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

Entity Framework 学习

Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍... 7 Entity Framework 学习初级篇3-- LINQ TOEntities. 10 Entity Framework 学习初级篇4--EntitySQL. 17 Entity Framework 学习初级篇5--ObjectQ

[Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)

http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可以使用各种方法查询实体数据模型.你选择有些方法是因为个人喜好,而其它的则是因为你可以利用特殊的效益.你很有可能已经听过LINQ to Entities和Entity SQL.你可以使用特殊的方法去查询,比如某些基于LINQ,而其它的基于EF的ObjectQuery类.这此查询方法中的每一个都会产生具

Entity Framework 实体框架的形成之旅--Code First的框架设计(5)

在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好,也可以利用图形化的设计器来设计表之间的关系,是开发项目较多采用的模式,不过问题还是这个XML太过复杂,因此有时候也想利用Code First模式构建整个框架.本文主要介绍利用Code First 来构建整个框架的过程以及碰到的问题探讨. 1.基于SqlServer的Code First模式 为了快速

使用 Entity Framework

在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码中手工造的数据.本文将演示如何在ASP.NET MVC中使用Entity Framework从数据库中获取数据.虽然本文题目听上去比较简单,但如果你认真阅读,相信你一定会有所收获. 本文目录: ORM 和 EF 当我们要开发一个应用程序,就要考虑怎样展示数据,怎样持久化数据.考虑这个问题时我们所要关心的东西,最重要的莫过于程序的性能.开发的简易性和代码的可维护

entity framework 新手入门篇(2)-entity framework基本的增删改查

经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 一.entity framework 相关类的理解. 首先,House数据库在映射后会生成一个名为HouseEntities的类,这个类我们称之为数据上下文,可以简单的理解为数据库的部分映射(如果映射了全部的表,视图,存储过程,则可看作全部映射). 使用数据库的时

Entity Framework 与 面向对象

说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述了在项目中用得比较多的通用的方法: 最后的项目迭代这次怎么迭代开发 现在有点晚了,我公司在山上,得赶着下山,没来得及审稿,所以有错误欢迎指正. 个人觉得有点赶,而且有点长,所以排列文本控制得不是很好,有待再继续补充或者修改. ======================分割线,专治强迫症,下面是半个

Entity Framework底层操作封装V2版本(1)

因为同志们一直给我提建议说,以前发的版本有问题.所以经过了我这一年多的使用和扩展,现在方法基本稳定了.现在贴出来给大家使用: 首先上场的是数据库操作层: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Data.Objects.DataClasses; using System.Refl

Entity Framework底层操作封装V2版本(2)

这个类是真正的数据库操作类,上面的那个类只是调用了这个封装类的方法进行的操作 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; using System.Data.Entity; using System.Data.Linq; using System.Data.Objects; using System.Refl