本文例子中使用環境:vs2017,sql server 2008
一,創建EF項目
1,解決方案添加.Net Framework類庫項目,在新建的項目下新建項:data->ADO.NET實體數據模型->來自數據庫的EF設計器,填寫數據庫連接,選擇包含的內容,完成創建。
二,創建接口及方法封裝
此過程可參考文章《關於EF 通用增刪改查的封裝》,這里復制下代碼。

using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Data; using MySql.Data.MySqlClient; /************************************************ ◇作者: LowKeyC ◇說明: 定義一個EF通用的CRUD的接口 ◇版本號:V1.0 ◇創建日期:2017年6月22日 星期四 *****************************************************/ namespace EFCommon.SqlHelp { public interface IRepository : IDisposable { /// <summary> /// 添加實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> bool Add<T>(T Entity) where T : class; /// <summary> /// 批量的進行添加實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> bool AddRange<T>(List<T> Entity) where T : class; /// <summary> /// 刪除單個實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> bool Delete<T>(T Entity) where T : class; /// <summary> /// 根據查詢條件進行刪除單個實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="whereLambda"></param> /// <returns></returns> bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class; /// <summary> ///單個對象的修改 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity">需要修改的對象</param> /// <returns></returns> bool Update<T>(T Entity) where T : class; /// <summary> /// 批量修改 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="whereLambda"></param> /// <param name="updateLambda"></param> /// <returns></returns> bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class; /// <summary> /// 批量的修改 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> bool Update<T>(List<T> Entity) where T : class; /// <summary> /// 批量統一的進行更新 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="model">需要修改的對象實體</param> /// <param name="WhereLambda">查詢的條件</param> /// <param name="ModifiedProNames"></param> /// <returns></returns> bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class; /// <summary> /// 根據主鍵進行查詢 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ID"></param> /// <returns></returns> T FindByID<T>(dynamic ID) where T : class; /// <summary> /// 默認查詢選擇第一條數據,沒有那么進行返回NULL /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns>返回bool</returns> T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; /// <summary> /// 查詢所有的數據 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> List<T> GetAll<T>(string Order = null) where T : class; /// <summary> /// 含有帶條件的查詢 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; /// <summary> ///獲取查詢的數量 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; /// <summary> /// 判斷對象是否存在 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class; /// <summary> /// 根據查詢過條件進行分頁 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TKey"></typeparam> /// <param name="PageIndex">當前頁面</param> /// <param name="PageSize">頁面的大小</param> /// <param name="TotalCount">總記錄數</param> /// <param name="OrderBy">排序的條件</param> /// <param name="WhereLambda">查詢條件</param> /// <param name="IsOrder">是否正序</param> /// <returns></returns> 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; /// <summary> /// 根據查詢條件進行做分頁查詢 /// </summary> /// <typeparam name="T">查詢的對象</typeparam> /// <param name="PageIndex">當前的頁碼</param> /// <param name="PageSize">每頁的大小</param> /// <param name="TotalCount">總頁數</param> /// <param name="ordering">排序條件</param> /// <param name="WhereLambda">查詢條件</param> /// <returns></returns> List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class; /// <summary> /// 根據查詢條件進行轉化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class; /// <summary> /// 執行存儲過程或自定義sql語句--返回集合 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Sql"></param> /// <param name="Parms"></param> /// <param name="CmdType"></param> /// <returns></returns> List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class; /// <summary> /// 回滾 /// </summary> /// <typeparam name="T"></typeparam> void RollBackChanges<T>() where T : class; } }

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Transactions; using System.Data.Entity; using System.Linq.Expressions; using System.Data; using System.Linq.Dynamic; using EntityFramework.Extensions; using System.Reflection; using System.Data.Entity.Infrastructure; using MySql.Data.MySqlClient; /************************************************ ◇作者: LowKeyC 需要引用這個程序集:EntityFramework.Extended.6.1.0.168 ◇說明: 實現EF通用的CRUD通用的接口 ◇版本號:V1.0 ◇創建日期:2017年6月22日 星期四 *****************************************************/ namespace EFCommon.SqlHelp { public class Repository : IRepository, IDisposable { private readonly static DbContext _DbContextHandle =new ahavadbEntities();//此處進行調用EF的DBContent 的實體類或者通過工廠化模式來進行調用。 /// <summary> /// 添加一個對象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> public bool Add<T>(T Entity) where T : class { using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required)) { _DbContextHandle.Set<T>().Add(Entity); int Count = _DbContextHandle.SaveChanges(); Ts.Complete(); return Count > 0; } } /// <summary> /// 批量的插入數據 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> public bool AddRange<T>(List<T> Entity) where T : class { using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required)) { _DbContextHandle.Set<T>().AddRange(Entity); int Count = _DbContextHandle.SaveChanges(); Ts.Complete(); return Count > 0; } } /// <summary> /// 根據查詢條件進行刪除對象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="whereLambda">查詢條件</param> /// <returns></returns> public bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class { using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required)) { var EntityModel = _DbContextHandle.Set<T>().Where(whereLambda).FirstOrDefault(); if (EntityModel != null) { _DbContextHandle.Set<T>().Remove(EntityModel); int Count = _DbContextHandle.SaveChanges(); Ts.Complete(); return Count > 0; } return false; } } /// <summary> /// 刪除單個對象的實體 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity">實體對象</param> /// <returns></returns> public bool Delete<T>(T Entity) where T : class { using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required)) { _DbContextHandle.Set<T>().Attach(Entity); _DbContextHandle.Set<T>().Remove(Entity); int Count = _DbContextHandle.SaveChanges(); Ts.Complete(); return Count > 0; } } /// <summary> /// 批量的進行更新數據 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity"></param> /// <returns></returns> public bool Update<T>(List<T> Entity) where T : class { int Count = 0; using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required)) { if (Entity != null) { foreach (var items in Entity) { var EntityModel = _DbContextHandle.Entry(Entity); _DbContextHandle.Set<T>().Attach(items); EntityModel.State = EntityState.Modified; } } Count = _DbContextHandle.SaveChanges(); Ts.Complete(); } return Count > 0; } /// <summary> /// 進行修改單個實體對象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Entity">實體對象</param> /// <returns></returns> public bool Update<T>(T Entity) where T : class { using (TransactionScope Ts = new TransactionScope()) { var EntityModel = _DbContextHandle.Entry<T>(Entity); _DbContextHandle.Set<T>().Attach(Entity); EntityModel.State = EntityState.Modified; int Count = _DbContextHandle.SaveChanges(); Ts.Complete(); return Count > 0; } } /// <summary> /// 批量的修改 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <param name="UpdateLambda"></param> /// <returns></returns> public bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class { _DbContextHandle.Set<T>().Where(WhereLambda).Update<T>(UpdateLambda); return _DbContextHandle.SaveChanges() > 0; } /// <summary> /// 查詢條件進行修改 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="model"></param> /// <param name="WhereLambda"></param> /// <param name="ModifiedProNames"></param> /// <returns></returns> public bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class { //查詢要修改的數據 List<T> ListModifing = _DbContextHandle.Set<T>().Where(WhereLambda).ToList(); Type t = typeof(T); List<PropertyInfo> ProInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList(); Dictionary<string, PropertyInfo> DitProList = new Dictionary<string, PropertyInfo>(); ProInfos.ForEach(p => { if (ModifiedProNames.Contains(p.Name)) { DitProList.Add(p.Name, p); } }); if (DitProList.Count <= 0) { throw new Exception("指定修改的字段名稱有誤或為空"); } foreach (var item in DitProList) { PropertyInfo proInfo = item.Value; object newValue = proInfo.GetValue(model, null); //批量進行修改相互對應的屬性 foreach (T oModel in ListModifing) { proInfo.SetValue(oModel, newValue, null);//設置其中新的值 } } return _DbContextHandle.SaveChanges() > 0; } /// <summary> /// 釋放緩存 /// </summary> public void Dispose() { _DbContextHandle.Dispose(); } /// <summary> /// 查詢單個對象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ID">主鍵ID</param> /// <returns></returns> public T FindByID<T>(dynamic ID) where T : class { return _DbContextHandle.Set<T>().Find(ID) ?? null; } /// <summary> /// 獲取全部數據的列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Order">排序</param> /// <returns></returns> public List<T> GetAll<T>(string Order = null) where T : class { return Order != null ? _DbContextHandle.Set<T>().OrderBy(Order).ToList() ?? null : _DbContextHandle.Set<T>().ToList() ?? null; } /// <summary> ///根據查詢條件進行查詢列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> public List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class { return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).ToList() ?? null : _DbContextHandle.Set<T>().ToList() ?? null; } /// <summary> ///判斷對象是否存在 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> public bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class { return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).Any() : _DbContextHandle.Set<T>().Any(); } /// <summary> /// 獲取查詢條件的記錄數 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> public int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class { return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).Count() : _DbContextHandle.Set<T>().Count(); } /// <summary> /// 獲取單條的記錄 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> public T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class { return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).FirstOrDefault() ?? null : _DbContextHandle.Set<T>().FirstOrDefault() ?? null; } /// <summary> /// 查詢對象的轉化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="WhereLambda"></param> /// <returns></returns> public List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class { return _DbContextHandle.Set<T>().Where(WhereLambda).ToList() ?? null; } /// <summary> ///根據查詢條件進行分頁 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="PageIndex">當前頁</param> /// <param name="PageSize">每頁的大小</param> /// <param name="TotalCount">總記錄數</param> /// <param name="ordering">排序條件</param> /// <param name="WhereLambda">查詢條件</param> /// <returns></returns> public List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string Ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class { //分頁的時候一定要注意 Order 一定在Skip 之前 var QueryList = _DbContextHandle.Set<T>().OrderBy(Ordering); if (WhereLambda != null) { QueryList = QueryList.Where(WhereLambda); } TotalCount = QueryList.Count(); return QueryList.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null; } /// <summary> ///根據查詢條件進行分頁 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="PageIndex">當前頁</param> /// <param name="PageSize">每頁的大小</param> /// <param name="TotalCount">總記錄數</param> /// <param name="OrderBy">排序條件</param> /// <param name="WhereLambda">查詢的條件</param> /// <param name="IsOrder"></param> /// <returns></returns> 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 { //分頁的時候一定要注意 Order一定在Skip 之前 IQueryable<T> QueryList = IsOrder == true ? _DbContextHandle.Set<T>().OrderBy(OrderBy) : _DbContextHandle.Set<T>().OrderByDescending(OrderBy); if (WhereLambda != null) { QueryList = QueryList.Where(WhereLambda); } TotalCount = QueryList.Count(); return QueryList.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null; } /// <summary> /// 執行存儲過程的SQL 語句 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="Sql">執行的SQL語句</param> /// <param name="Parms">SQL 語句的參數</param> /// <param name="CmdType"></param> /// <returns></returns> public List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class { //進行執行存儲過程 if (CmdType == CommandType.StoredProcedure) { StringBuilder paraNames = new StringBuilder(); foreach (var item in Parms) { paraNames.Append($" @{item},"); } Sql = paraNames.Length > 0 ? $"exec {Sql} {paraNames.ToString().Trim(',')}" : $"exec {Sql} "; } return _DbContextHandle.Set<T>().SqlQuery(Sql, Parms.ToArray()).ToList(); } /// <summary> /// 進行回滾 /// </summary> /// <typeparam name="T"></typeparam> public void RollBackChanges<T>() where T : class { var Query = _DbContextHandle.ChangeTracker.Entries().ToList(); Query.ForEach(p => p.State = EntityState.Unchanged); } } }
因本人使用的是sql server,因此修改這部分的mysql,改用System.Data.SqlClient。采用上面的代碼,應該會報錯在OrderBy(string),因為構建的是LambdaExpression 類型的,這位大神給出了很好的解決方案,一起去看看吧——c# 擴展方法 奇思妙用 高級篇 九:OrderBy(string propertyName, bool desc)
三,使用注意事項
1,需要把EF的配置拷貝到主程序配置里。
2,在主程序配置中添加entityFramework的節點配置
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb"/> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/> </providers> </entityFramework>
3,在主程序中NuGet包中添加下EntityFramework