关于EF 通用增删改查的封装

1.  Entity Framework是Microsoft的ORM框架,随着 Entity Framework 不断的完善强化已经到达了EF 6.0+ 还是非常的完善的,目前使用的比例相对于其他ORM 的框架还是比较多的。例如有我们目前使用较多的是EF和Drapper 和SQL Sugar 以及NHibernate 当然NHibernate 我使用的不多。当然EF确实使用起来非常的方便开发的速度是比较快的,EF 毕竟在Microsoft 在.NET 体系中已经推出了多年了,无论是成熟度还是其中的性能以及优化的程度都得到了很好很大的改善, 所以还是非常值得我们学习使用,当然我这个不是吹嘘EF 好,而且有的朋友也说了 EF 性能不好效率不高,我想询问一下 针对于这些问题你想过如何进行优化 以及改进没有其实目前改进的方案网上还是非常多的,当然也有很多开发者为EF提供了扩展功能,如Entity Framework  Extended 等里面封装的一些方法就是非常好使用的。而且作为.NET 开发者来说项目的通用性也是非常的强大的,资料也是非常多的,Microsoft在这块的更新力度也很给力。Entity Framework  提供了三种开发模式,Code Frist,Database-First,Model-First。 目前采用Code Frist 的比较多一些 ,但是我建议大家可以使用DB Frist  简单好用。操作方便。当然你如果你喜欢Code Frist 也是拥有自己的好处,反正三者之间 都是相通的,没有什么难点的。都是ORM 之间的转化。

Database-First模式明显性能会差点,非常的适合初学者,或者是比较急的中小型项目一般情况下使用还是足够的。(数据量200W左右还是足够应付的)。

Model-First模式优点是开发人员能够在设计模型时完全了解数据库的结构以及表格之间的关系,但是缺点是在模型设计完后,还是需要去手动创建数据库,而且生成的脚本有点不简洁。

Code-First模式有点不用说了,就是上面两个模式的缺点。缺点应该也是有很多的,比如更新数据库。涉及到数据的迁移这一块。就让大多数人比较头疼。目前解决的方案比较多。

这个这个只是我个人的意见和看法 。所以关于这个EF 的开发模式的如何的使用,决定权利在于你的项目和数据库数据量大小和你公司的目前存在的框架。

2. 关于我个人封装的通用的EF 比较简单好用就是正对于数据库的CRUD ,而且非常适合于单个数据库的读写的操作。 当然你也可以进行对于数据库进行读写分离的操作,建立相互对应的数据库的集群,那么其实说白了 EF本身就是一个对于CRUD 的读写的操作。使用过EF的人知道,EF提供访问数据库的是 DbContext 这个对象,所以想实现读写分离的就很简单了,只要在程序中使用两个不同的DbContext对象,一个负责读,一个负责写就好了。当然你也可以进行使用相对应的工厂化模式进行 读写分离的操作也可以通过 常用的反射来进行读写的操作,决定权取决在你的手上。所以我们在使用其中的读写分离的时候你只管进行对于 DbContext   进行操作就是了 建立相互对于的读写的类就可以了。 一般读写进行分离的都是进行同步于主库的。因为一般情况下的读写的分离 都是一主多从库的模式。

3.在使用这个通用EF CRUD 类的时候需要 进行添加EntityFramework.Extended.6.1.0.168    EntityFramework 6.1.3  两个程序集 。当然 我这里使用的是MySQL 数据库 所以还添加MySQL Data Entity 的等等。添加以上引用的程序集 就可以了。然后还需要添加相对应的Transaction的程序集,这个时候有的朋友就问了 添加Transaction做什么 我的目的就是通过建立想对应的事务来进行回滚 处理简单的并发 要做全部都做,要么全部都不做。如果你采用Queue 来进行解决并发那就更好了。其中关于EF 的CRUD 的通用代码如下。

  

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq.Expressions;
  4 using System.Data;
  5 using MySql.Data.MySqlClient;
  6 /************************************************
  7 ◇作者: LowKeyC
  8 ◇说明: 定义一个EF通用的CRUD的接口
  9 ◇版本号:V1.0
 10 ◇创建日期:2017年6月22日  星期四
 11 *****************************************************/
 12 
 13 namespace EFCommon.SqlHelp
 14 {
 15     public interface IRepository : IDisposable
 16     {
 17 
 18         /// <summary>
 19         /// 添加实体
 20         /// </summary>
 21         /// <typeparam name="T"></typeparam>
 22         /// <param name="Entity"></param>
 23         /// <returns></returns>
 24         bool Add<T>(T Entity) where T : class;
 25 
 26         /// <summary>
 27         /// 批量的进行添加实体
 28         /// </summary>
 29         /// <typeparam name="T"></typeparam>
 30         /// <param name="Entity"></param>
 31         /// <returns></returns>
 32         bool AddRange<T>(List<T> Entity) where T : class;
 33 
 34 
 35         /// <summary>
 36         /// 删除单个实体
 37         /// </summary>
 38         /// <typeparam name="T"></typeparam>
 39         /// <param name="Entity"></param>
 40         /// <returns></returns>
 41         bool Delete<T>(T Entity) where T : class;
 42 
 43         /// <summary>
 44         /// 根据查询条件进行删除单个实体
 45         /// </summary>
 46         /// <typeparam name="T"></typeparam>
 47         /// <param name="whereLambda"></param>
 48         /// <returns></returns>
 49         bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class;
 50          
 51 
 52         /// <summary>
 53         ///单个对象的修改
 54         /// </summary>
 55         /// <typeparam name="T"></typeparam>
 56         /// <param name="Entity">需要修改的对象</param>
 57         /// <returns></returns>
 58         bool Update<T>(T Entity) where T : class;
 59 
 60 
 61         /// <summary>
 62         /// 批量修改
 63         /// </summary>
 64         /// <typeparam name="T"></typeparam>
 65         /// <param name="whereLambda"></param>
 66         /// <param name="updateLambda"></param>
 67         /// <returns></returns>
 68         bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class;
 69 
 70 
 71         /// <summary>
 72         /// 批量的修改
 73         /// </summary>
 74         /// <typeparam name="T"></typeparam>
 75         /// <param name="Entity"></param>
 76         /// <returns></returns>
 77         bool Update<T>(List<T> Entity) where T : class;
 78 
 79 
 80         /// <summary>
 81         /// 批量统一的进行更新
 82         /// </summary>
 83         /// <typeparam name="T"></typeparam>
 84         /// <param name="model">需要修改的对象实体</param>
 85         /// <param name="WhereLambda">查询的条件</param>
 86         /// <param name="ModifiedProNames"></param>
 87         /// <returns></returns>
 88         bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class;
 89 
 90 
 91         /// <summary>
 92         /// 根据主键进行查询
 93         /// </summary>
 94         /// <typeparam name="T"></typeparam>
 95         /// <param name="ID"></param>
 96         /// <returns></returns>
 97         T FindByID<T>(dynamic ID) where T : class;
 98 
 99         /// <summary>
100         /// 默认查询选择第一条数据,没有那么进行返回NULL
101         /// </summary>
102         /// <typeparam name="T"></typeparam>
103         /// <param name="WhereLambda"></param>
104         /// <returns>返回bool</returns>
105         T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
106 
107         /// <summary>
108         /// 查询所有的数据
109         /// </summary>
110         /// <typeparam name="T"></typeparam>
111         /// <returns></returns>
112         List<T> GetAll<T>(string Order = null) where T : class;
113 
114         /// <summary>
115         /// 含有带条件的查询
116         /// </summary>
117         /// <typeparam name="T"></typeparam>
118         /// <param name="WhereLambda"></param>
119         /// <returns></returns>
120         List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
121 
122 
123         /// <summary>
124         ///获取查询的数量
125         /// </summary>
126         /// <typeparam name="T"></typeparam>
127         /// <param name="WhereLambda"></param>
128         /// <returns></returns>
129         int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
130 
131         /// <summary>
132         /// 判断对象是否存在
133         /// </summary>
134         /// <typeparam name="T"></typeparam>
135         /// <param name="WhereLambda"></param>
136         /// <returns></returns>
137         bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
138 
139 
140         /// <summary>
141         /// 根据查询过条件进行分页
142         /// </summary>
143         /// <typeparam name="T"></typeparam>
144         /// <typeparam name="TKey"></typeparam>
145         /// <param name="PageIndex">当前页面</param>
146         /// <param name="PageSize">页面的大小</param>
147         /// <param name="TotalCount">总记录数</param>
148         /// <param name="OrderBy">排序的条件</param>
149         /// <param name="WhereLambda">查询条件</param>
150         /// <param name="IsOrder">是否正序</param>
151         /// <returns></returns>
152         List<T> Pagination<T, TKey>(int PageIndex, int PageSize, out int TotalCount, Expression<Func<T, TKey>> OrderBy, Expression<Func<T, bool>> WhereLambda = null, bool IsOrder = true) where T : class;
153 
154 
155         /// <summary>
156         /// 根据查询条件进行做分页查询
157         /// </summary>
158         /// <typeparam name="T">查询的对象</typeparam>
159         /// <param name="PageIndex">当前的页码</param>
160         /// <param name="PageSize">每页的大小</param>
161         /// <param name="TotalCount">总页数</param>
162         /// <param name="ordering">排序条件</param>
163         /// <param name="WhereLambda">查询条件</param>
164         /// <returns></returns>
165         List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class;
166 
167 
168         /// <summary>
169         /// 根据查询条件进行转化
170         /// </summary>
171         /// <typeparam name="T"></typeparam>
172         /// <param name="WhereLambda"></param>
173         /// <returns></returns>
174         List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class;
175 
176 
177         /// <summary>
178         /// 执行存储过程或自定义sql语句--返回集合
179         /// </summary>
180         /// <typeparam name="T"></typeparam>
181         /// <param name="Sql"></param>
182         /// <param name="Parms"></param>
183         /// <param name="CmdType"></param>
184         /// <returns></returns>
185         List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class;
186 
187 
188         /// <summary>
189         /// 回滚
190         /// </summary>
191         /// <typeparam name="T"></typeparam>
192         void RollBackChanges<T>() where T : class;
193 
194     }
195 }

4.关于如何实现以上接口的方法。如下面代码所示。当然你也可以将进行实例化对象这里进行采用简单工厂 或者抽象工厂 全凭个人想法。

  

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Transactions;
  6 using System.Data.Entity;
  7 using System.Linq.Expressions;
  8 using System.Data;
  9 using System.Linq.Dynamic;
 10 using EntityFramework.Extensions;
 11 using System.Reflection;
 12 using System.Data.Entity.Infrastructure;
 13 using MySql.Data.MySqlClient;
 14 /************************************************
 15 ◇作者: LowKeyC  需要引用这个程序集:EntityFramework.Extended.6.1.0.168
 16 ◇说明: 实现EF通用的CRUD通用的接口  
 17 ◇版本号:V1.0   
 18 ◇创建日期:2017年6月22日 星期四
 19 *****************************************************/
 20 namespace EFCommon.SqlHelp
 21 {
 22     public class Repository : IRepository, IDisposable
 23     {
 24 
 25         private readonly static  DbContext _DbContextHandle =new ahavadbEntities();//此处进行调用EF的DBContent 的实体类或者通过工厂化模式来进行调用。
 26 
 27         /// <summary>
 28         /// 添加一个对象
 29         /// </summary>
 30         /// <typeparam name="T"></typeparam>
 31         /// <param name="Entity"></param>
 32         /// <returns></returns>
 33         public bool Add<T>(T Entity) where T : class
 34         {
 35             using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
 36             {
 37                 _DbContextHandle.Set<T>().Add(Entity);
 38                 int Count = _DbContextHandle.SaveChanges();
 39                 Ts.Complete();
 40                 return Count > 0;
 41             }
 42         }
 43 
 44         /// <summary>
 45         /// 批量的插入数据
 46         /// </summary>
 47         /// <typeparam name="T"></typeparam>
 48         /// <param name="Entity"></param>
 49         /// <returns></returns>
 50         public bool AddRange<T>(List<T> Entity) where T : class
 51         {
 52             using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
 53             {
 54                 _DbContextHandle.Set<T>().AddRange(Entity);
 55                 int Count = _DbContextHandle.SaveChanges();
 56                 Ts.Complete();
 57                 return Count > 0;
 58             }
 59         }
 60 
 61         /// <summary>
 62         /// 根据查询条件进行删除对象
 63         /// </summary>
 64         /// <typeparam name="T"></typeparam>
 65         /// <param name="whereLambda">查询条件</param>
 66         /// <returns></returns>
 67         public bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class
 68         {
 69             using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
 70             {
 71                 var EntityModel = _DbContextHandle.Set<T>().Where(whereLambda).FirstOrDefault();
 72                 if (EntityModel != null)
 73                 {
 74                     _DbContextHandle.Set<T>().Remove(EntityModel);
 75                     int Count = _DbContextHandle.SaveChanges();
 76                     Ts.Complete();
 77                     return Count > 0;
 78                 }
 79                 return false;
 80             }
 81         }
 82 
 83 
 84         /// <summary>
 85         /// 删除单个对象的实体
 86         /// </summary>
 87         /// <typeparam name="T"></typeparam>
 88         /// <param name="Entity">实体对象</param>
 89         /// <returns></returns>
 90         public bool Delete<T>(T Entity) where T : class
 91         {
 92             using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
 93             {
 94                 _DbContextHandle.Set<T>().Attach(Entity);
 95                 _DbContextHandle.Set<T>().Remove(Entity);
 96                 int Count = _DbContextHandle.SaveChanges();
 97                 Ts.Complete();
 98                 return Count > 0;
 99             }
100         }
101 
102         /// <summary>
103         /// 批量的进行更新数据
104         /// </summary>
105         /// <typeparam name="T"></typeparam>
106         /// <param name="Entity"></param>
107         /// <returns></returns>
108         public bool Update<T>(List<T> Entity) where T : class
109         {
110             int Count = 0;
111             using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
112             {
113                 if (Entity != null)
114                 {
115                     foreach (var items in Entity)
116                     {
117                         var EntityModel = _DbContextHandle.Entry(Entity);
118                         _DbContextHandle.Set<T>().Attach(items);
119                         EntityModel.State = EntityState.Modified;
120                     }
121 
122                 }
123                 Count = _DbContextHandle.SaveChanges();
124                 Ts.Complete();
125             }
126 
127             return Count > 0;
128         }
129 
130 
131         /// <summary>
132         /// 进行修改单个实体对象
133         /// </summary>
134         /// <typeparam name="T"></typeparam>
135         /// <param name="Entity">实体对象</param>
136         /// <returns></returns>
137         public bool Update<T>(T Entity) where T : class
138         {
139             using (TransactionScope Ts = new TransactionScope())
140             {
141                 var EntityModel = _DbContextHandle.Entry<T>(Entity);
142                 _DbContextHandle.Set<T>().Attach(Entity);
143                 EntityModel.State = EntityState.Modified;
144                 int Count = _DbContextHandle.SaveChanges();
145                 Ts.Complete();
146                 return Count > 0;
147             }
148         }
149 
150         /// <summary>
151         /// 批量的修改
152         /// </summary>
153         /// <typeparam name="T"></typeparam>
154         /// <param name="WhereLambda"></param>
155         /// <param name="UpdateLambda"></param>
156         /// <returns></returns>
157         public bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class
158         {
159             _DbContextHandle.Set<T>().Where(WhereLambda).Update<T>(UpdateLambda);
160             return _DbContextHandle.SaveChanges() > 0;
161         }
162 
163 
164         /// <summary>
165         /// 查询条件进行修改
166         /// </summary>
167         /// <typeparam name="T"></typeparam>
168         /// <param name="model"></param>
169         /// <param name="WhereLambda"></param>
170         /// <param name="ModifiedProNames"></param>
171         /// <returns></returns>
172         public bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class
173         {
174             //查询要修改的数据
175             List<T> ListModifing = _DbContextHandle.Set<T>().Where(WhereLambda).ToList();
176             Type t = typeof(T);
177             List<PropertyInfo> ProInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
178             Dictionary<string, PropertyInfo> DitProList = new Dictionary<string, PropertyInfo>();
179             ProInfos.ForEach(p =>
180             {
181                 if (ModifiedProNames.Contains(p.Name))
182                 {
183                     DitProList.Add(p.Name, p);
184                 }
185             });
186 
187             if (DitProList.Count <= 0)
188             {
189                 throw new Exception("指定修改的字段名称有误或为空");
190             }
191             foreach (var item in DitProList)
192             {
193                 PropertyInfo proInfo = item.Value;
194                 object newValue = proInfo.GetValue(model, null);
195                 //批量进行修改相互对应的属性
196                 foreach (T oModel in ListModifing)
197                 {
198                     proInfo.SetValue(oModel, newValue, null);//设置其中新的值
199                 }
200             }
201 
202             return _DbContextHandle.SaveChanges() > 0;
203         } 
204         /// <summary>
205         /// 释放缓存
206         /// </summary>
207         public void Dispose()
208         {
209             _DbContextHandle.Dispose();
210         }
211 
212         /// <summary>
213         /// 查询单个对象
214         /// </summary>
215         /// <typeparam name="T"></typeparam>
216         /// <param name="ID">主键ID</param>
217         /// <returns></returns>
218         public T FindByID<T>(dynamic ID) where T : class
219         {
220             return _DbContextHandle.Set<T>().Find(ID) ?? null;
221         }
222 
223 
224         /// <summary>
225         /// 获取全部数据的列表
226         /// </summary>
227         /// <typeparam name="T"></typeparam>
228         /// <param name="Order">排序</param>
229         /// <returns></returns>
230         public List<T> GetAll<T>(string Order = null) where T : class
231         {
232             return Order != null ? _DbContextHandle.Set<T>().OrderBy(Order).ToList() ?? null : _DbContextHandle.Set<T>().ToList() ?? null;
233         }
234 
235         /// <summary>
236         ///根据查询条件进行查询列表
237         /// </summary>
238         /// <typeparam name="T"></typeparam>
239         /// <param name="WhereLambda"></param>
240         /// <returns></returns>
241         public List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
242         {
243             return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).ToList() ?? null : _DbContextHandle.Set<T>().ToList() ?? null;
244         }
245 
246         /// <summary>
247         ///判断对象是否存在
248         /// </summary>
249         /// <typeparam name="T"></typeparam>
250         /// <param name="WhereLambda"></param>
251         /// <returns></returns>
252         public bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
253         {
254             return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).Any() : _DbContextHandle.Set<T>().Any();
255         }
256 
257         /// <summary>
258         /// 获取查询条件的记录数
259         /// </summary>
260         /// <typeparam name="T"></typeparam>
261         /// <param name="WhereLambda"></param>
262         /// <returns></returns>
263         public int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
264         {
265             return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).Count() : _DbContextHandle.Set<T>().Count();
266         }
267 
268 
269         /// <summary>
270         /// 获取单条的记录
271         /// </summary>
272         /// <typeparam name="T"></typeparam>
273         /// <param name="WhereLambda"></param>
274         /// <returns></returns>
275         public T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
276         {
277             return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).FirstOrDefault() ?? null : _DbContextHandle.Set<T>().FirstOrDefault() ?? null;
278         }
279 
280 
281         /// <summary>
282         /// 查询对象的转化
283         /// </summary>
284         /// <typeparam name="T"></typeparam>
285         /// <param name="WhereLambda"></param>
286         /// <returns></returns>
287         public List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class
288         {
289             return _DbContextHandle.Set<T>().Where(WhereLambda).ToList() ?? null;
290         }
291 
292         /// <summary>
293         ///根据查询条件进行分页
294         /// </summary>
295         /// <typeparam name="T"></typeparam>
296         /// <param name="PageIndex">当前页</param>
297         /// <param name="PageSize">每页的大小</param>
298         /// <param name="TotalCount">总记录数</param>
299         /// <param name="ordering">排序条件</param>
300         /// <param name="WhereLambda">查询条件</param>
301         /// <returns></returns>
302         public List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string Ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class
303         {
304             //分页的时候一定要注意 Order 一定在Skip 之前
305             var QueryList = _DbContextHandle.Set<T>().OrderBy(Ordering);
306             if (WhereLambda != null)
307             {
308                 QueryList = QueryList.Where(WhereLambda);
309             }
310 
311             TotalCount = QueryList.Count();
312             return QueryList.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null;
313         }
314 
315         /// <summary>
316         ///根据查询条件进行分页
317         /// </summary>
318         /// <typeparam name="T"></typeparam>
319         /// <param name="PageIndex">当前页</param>
320         /// <param name="PageSize">每页的大小</param>
321         /// <param name="TotalCount">总记录数</param>
322         /// <param name="OrderBy">排序条件</param>
323         /// <param name="WhereLambda">查询的条件</param>
324         /// <param name="IsOrder"></param>
325         /// <returns></returns>
326         public List<T> Pagination<T, TKey>(int PageIndex, int PageSize, out int TotalCount, Expression<Func<T, TKey>> OrderBy, Expression<Func<T, bool>> WhereLambda = null, bool IsOrder = true) where T : class
327         {
328             //分页的时候一定要注意 Order一定在Skip 之前
329             IQueryable<T> QueryList = IsOrder == true ? _DbContextHandle.Set<T>().OrderBy(OrderBy) : _DbContextHandle.Set<T>().OrderByDescending(OrderBy);
330 
331             if (WhereLambda != null)
332             {
333                 QueryList = QueryList.Where(WhereLambda);
334             }
335 
336             TotalCount = QueryList.Count();
337             return QueryList.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null;
338         }
339 
340 
341         /// <summary>
342         /// 执行存储过程的SQL 语句
343         /// </summary>
344         /// <typeparam name="T"></typeparam>
345         /// <param name="Sql">执行的SQL语句</param>
346         /// <param name="Parms">SQL 语句的参数</param>
347         /// <param name="CmdType"></param>
348         /// <returns></returns>
349         public List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class
350         {
351             //进行执行存储过程
352             if (CmdType == CommandType.StoredProcedure)
353             {
354                 StringBuilder paraNames = new StringBuilder();
355                 foreach (var item in Parms)
356                 {
357                     paraNames.Append($" @{item},");
358                 }
359                 Sql = paraNames.Length > 0 ? $"exec {Sql} {paraNames.ToString().Trim(',')}" : $"exec {Sql} ";
360             }
361             return _DbContextHandle.Set<T>().SqlQuery(Sql, Parms.ToArray()).ToList();
362         }
363 
364 
365         /// <summary>
366         /// 进行回滚
367         /// </summary>
368         /// <typeparam name="T"></typeparam>
369         public void RollBackChanges<T>() where T : class
370         {
371             var Query = _DbContextHandle.ChangeTracker.Entries().ToList();
372 
373             Query.ForEach(p => p.State = EntityState.Unchanged);
374         }
375 
376     }
377 }

  以上内容 全部是基于原创 部分观点 引用了百度百科 以及个人的对于EF 的理解。如需转载请表明!

再牛逼的梦想,也抵不住我傻逼似的坚持!别在该奋斗的年纪,贪图安逸。 今天多学一些知识,明天开发的速度就更快一下。后天你就会变得更好。
原文地址:https://www.cnblogs.com/LowKeyCXY/p/7170728.html