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難免有表達不當或者技術失誤的地方,如有不當,請多多指出,感激不盡~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM