BIM工程信息管理系統-EF實體框架數據操作基類

来源:https://www.cnblogs.com/w2011/archive/2019/08/01/11286124.html
-Advertisement-
Play Games

EF實體框架數據操作基類主要是規範增、改、查、分頁、Lambda表達式條件處理,以及非同步操作等特性,這樣能夠儘可能的符合基類這個特殊類的定義,實現功能介面的最大化重用和統一。 1、程式代碼 #region 00 單例模式 private static BaseDAL<T> _mInstance = ...


EF實體框架數據操作基類主要是規範增、改、查、分頁、Lambda表達式條件處理,以及非同步操作等特性,這樣能夠儘可能的符合基類這個特殊類的定義,實現功能介面的最大化重用和統一。

1、程式代碼

 /// <summary>
    /// MSSQL資料庫 數據層的父類
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BaseDAL<T> where T : class
    {
        //EF上下文
        private readonly DbContext _db;
      #region 00 單例模式

        private static BaseDAL<T> _mInstance = null;
        private static object obj = new object();

        public BaseDAL(DbContext db)
        {
            _db = db;
        }

        public static BaseDAL<T> ManagerContent(DbContext dbContext)
        {
            if (_mInstance == null)
            {
                lock (obj)
                {
                    _mInstance = new BaseDAL<T>(dbContext);
                }
            }
            return _mInstance;
        }

        #endregion
00 單例模式
 #region 1.0 新增 實體 +int Add(T model)
        /// <summary>
        /// 新增 實體
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool Add(T model)
        {
            try
            {
                _db.Set<T>().Add(model);
                _db.SaveChanges();
                //保存成功後,會將自增的id設置給 model的 主鍵屬性,並返回受影響行數
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 
            return true;
        }
        #endregion
1.0 新增 實體 +int Add(T model)
 #region 2.0 根據 id 刪除 +bool Del(T model)
        /// <summary>
        /// 根據 id 刪除
        /// </summary>
        /// <param name="model">包含要刪除id的對象</param>
        /// <returns></returns>
        public bool Del(T model)
        {
            try
            {
                _db.Set<T>().Attach(model);
                _db.Set<T>().Remove(model);
               _db.SaveChanges();
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 
            return true;
        }
        #endregion
2.0 根據 id 刪除 +bool Del(T model)
      #region 3.0 根據條件刪除 +bool DelBy(Expression<Func<T, bool>> delWhere)
        /// <summary>
        /// 3.0 根據條件刪除
        /// </summary>
        /// <param name="delWhere"></param>
        /// <returns></returns>
        public bool DelBy(Expression<Func<T, bool>> delWhere)
        {
            try
            {
                //3.1查詢要刪除的數據
                List<T> listDeleting = _db.Set<T>().Where(delWhere).ToList();
                //3.2將要刪除的數據 用刪除方法添加到 EF 容器中
                listDeleting.ForEach(u =>
                {
                    _db.Set<T>().Attach(u);//先附加到 EF容器
                    _db.Set<T>().Remove(u);//標識為 刪除 狀態
                });
                //3.3一次性 生成sql語句到資料庫執行刪除
                 _db.SaveChanges();
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 
            return true;
        }
        #endregion
3.0 根據條件刪除 +bool DelBy(Expression<Func<T, bool>> delWhere)
  #region 4.0 修改 +bool Modify(T model, params string[] proNames)
        /// <summary>
        /// 4.0 修改,如:
        /// T u = new T() { uId = 1, uLoginName = "asdfasdf" };
        /// this.Modify(u, "uLoginName");
        /// </summary>
        /// <param name="model">要修改的實體對象</param>
        /// <param name="proNames">要修改的 屬性 名稱</param>
        /// <returns></returns>
        public bool Modify(T model, params string[] proNames)
        {
            try
            {
                //4.1將 對象 添加到 EF中
                DbEntityEntry entry = _db.Entry<T>(model);
                //4.2先設置 對象的包裝 狀態為 Unchanged
                entry.State = EntityState.Unchanged;
                //4.3迴圈 被修改的屬性名 數組
                foreach (string proName in proNames)
                {
                    //4.4將每個 被修改的屬性的狀態 設置為已修改狀態;後面生成update語句時,就只為已修改的屬性 更新
                    entry.Property(proName).IsModified = true;
                }
                //4.4一次性 生成sql語句到資料庫執行
                _db.SaveChanges();
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 

            return true;
        }
        #endregion
4.0 修改 +bool Modify(T model, params string[] proNames)
  #region 4.1 批量修改 +bool Modify(T model, Expression<Func<T, bool>> whereLambda, params string[] modifiedProNames)
        /// <summary>
        /// 4.0 批量修改
        /// </summary>
        /// <param name="model">要修改的實體對象</param>
        /// <param name="whereLambda">查詢條件</param>
        /// <param name="modifiedProNames">要修改的 屬性 名稱</param>
        /// <returns></returns>
        public bool ModifyBy(T model, Expression<Func<T, bool>> whereLambda, params string[] modifiedProNames)
        {
            try
            {
                //4.1查詢要修改的數據
                List<T> listModifing = _db.Set<T>().Where(whereLambda).ToList();

                //獲取 實體類 類型對象
                Type t = typeof(T); // model.GetType();
                //獲取 實體類 所有的 公有屬性
                List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
                //創建 實體屬性 字典集合
                Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>();
                //將 實體屬性 中要修改的屬性名 添加到 字典集合中 鍵:屬性名  值:屬性對象
                proInfos.ForEach(p =>
                {
                    if (modifiedProNames.Contains(p.Name))
                    {
                        dictPros.Add(p.Name, p);
                    }
                });

                //4.3迴圈 要修改的屬性名
                foreach (string proName in modifiedProNames)
                {
                    //判斷 要修改的屬性名是否在 實體類的屬性集合中存在
                    if (dictPros.ContainsKey(proName))
                    {
                        //如果存在,則取出要修改的 屬性對象
                        PropertyInfo proInfo = dictPros[proName];
                        //取出 要修改的值
                        object newValue = proInfo.GetValue(model, null); //object newValue = model.uName;

                        //4.4批量設置 要修改 對象的 屬性
                        foreach (T usrO in listModifing)
                        {
                            //為 要修改的對象 的 要修改的屬性 設置新的值
                            proInfo.SetValue(usrO, newValue, null); //usrO.uName = newValue;
                        }
                    }
                }
                //4.4一次性 生成sql語句到資料庫執行
                 _db.SaveChanges();
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 

            return true;
        }
        #endregion
4.1 批量修改 +bool Modify(T model, Expression<Func<T, bool>> whereLambda, params string[] modifiedProNames)
   #region 4.2 修改個單個實體
        public bool Modify(T model)
        {
            try
            {
                _db.Entry(typeof (T)).State = EntityState.Modified;
                //4.4一次性 生成sql語句到資料庫執行
                _db.SaveChanges();
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            }

            return true;
        }
        #endregion
4.2 修改個單個實體
#region 5.0 根據條件查詢 +IQueryable<T> GetListBy(Expression<Func<T,bool>> whereLambda)
        /// <summary>
        /// 5.0 根據條件查詢 +List<T> GetListBy(Expression<Func<T,bool>> whereLambda)
        /// </summary>
        /// <param name="whereLambda">Lambda表達式</param>
        /// <returns></returns>
        public IQueryable<T> GetListBy(Expression<Func<T, bool>> whereLambda)
        {
            try
            {
                return _db.Set<T>().Where(whereLambda);
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 
        }
        #endregion
5.0 根據條件查詢 +IQueryable GetListBy(Expression<Func<T,bool>> whereLambda)
#region 5.1 根據條件 排序 和查詢 + IQueryable<T> GetListBy<TKey>
        /// <summary>
        /// 5.1 根據條件 排序 和查詢
        /// </summary>
        /// <typeparam name="TKey">排序欄位類型</typeparam>
        /// <param name="whereLambda">查詢條件 lambda表達式</param>
        /// <param name="orderLambda">排序條件 lambda表達式</param>
        /// <returns></returns>
        public IQueryable<T> GetListBy<TKey>(Expression<Func<T, bool>> whereLambda, Expression<Func<T, TKey>> orderLambda)
        {
            try
            {
                return _db.Set<T>().Where(whereLambda).OrderBy(orderLambda);
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 
        }
        #endregion
5.1 根據條件 排序 和查詢 + IQueryable GetListBy
#region 5.2 根據條件查詢 返回單條數據 T GetEntity(Expression<Func<T, bool>> whereLambda)

        public T GetEntity(Expression<Func<T, bool>> whereLambda)
        {
            try
            {
                return _db.Set<T>().First(whereLambda);
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
             throw   exc.InnerException;
            }  
        }
        #endregion
5.2 根據條件查詢 返回單條數據 T GetEntity(Expression<Func<T, bool>> whereLambda)
    #region 6.0 分頁查詢 + IQueryable<T> GetPagedList<TKey>
        /// <summary>
        /// 6.0 分頁查詢 + IQueryable<T> GetPagedList<TKey>
        /// </summary>
        /// <param name="pageIndex">頁碼</param>
        /// <param name="pageSize">頁容量</param>
        /// <param name="whereLambda">條件 lambda表達式</param>
        /// <param name="orderBy">排序 lambda表達式</param>
        /// <returns></returns>
        public IQueryable<T> GetPagedList<TKey>(int pageIndex, int pageSize, Expression<Func<T, bool>> whereLambda, Expression<Func<T, TKey>> orderBy)
        {
            // 分頁 一定註意: Skip 之前一定要 OrderBy
            try
            {
                return _db.Set<T>().Where(whereLambda).OrderBy(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize);
            }
            catch (EntityException ex)
            {
                LogHelper.Error("Add", ex);
                LogHelper.Error(ex.Message); throw ex.InnerException;
            }
            catch (DbException exc)
            {
                LogHelper.Error("Add", exc);
                throw exc.InnerException;
            } 
        }
        #endregion
6.0 分頁查詢 + IQueryable GetPagedList
#region 7.0執行SQL+string ExecMaxValueSql()
        public string ExecMaxValueSql()
        {
            string sql = @"begin tran
                DECLARE @Value bigint
                update " + typeof(T).Name + @"
                set value = value+1;
                select @Value = value from " + typeof(T).Name + @";
                 select cast(@Value as varchar(10));
                commit tran";
            string value = _db.Database.SqlQuery<string>(sql).First();

            return value;
        }
        #endregion
7.0執行SQL+string ExecMaxValueSql()
   }

2、 日誌記錄組件採用 Log4Net

   public class LogHelper
    {
        private static readonly log4net.ILog Log = log4net.LogManager.GetLogger("ApplicationLog");
        public static void Info(string info)
        {
            Log.Info(info);
        }
        public static void Info(string info, Exception ex)
        {
            Log.Info(info, ex);
        }
        public static void Error(string info, Exception ex)
        {
            Log.Info(info, ex);
        }
        public static void Error(string info)
        {
            Log.Error(info);
        }
        public void Debug(string info)
        {
            Log.Debug(info);
        }
        public void Debug(string info, Exception se)
        {
            Log.Debug(info, se);
        }
        public void Warn(string info)
        {
            Log.Warn(info);
        }
        public void Warn(string info, Exception ex)
        {
            Log.Warn(info, ex);
        }
        public void Fatal(string info)
        {
            Log.Fatal(info);
        }
        public void Fatal(string info, Exception ex)
        {
            Log.Fatal(info, ex);
        }
    }
日誌記錄
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <logger name="ApplicationLog">
    <level value="INFO" />
    <appender-ref ref="rollingFile" />
  </logger>

  <appender name="rollingFile" type="log4net.Appender.RollingFileAppender, log4net" >
    <param name="File" value="ServiceLog.txt" />
    <param name="AppendToFile" value="true" />
    <param name="RollingStyle" value="Date" />
    <param name="MaximumFileSize" value="5MB"></param>
    <param name="DatePattern" value="_yyyy.MM.dd" />
    <param name="StaticLogFileName" value="true" />
    <layout type="log4net.Layout.PatternLayout, log4net">
      <param name="ConversionPattern" value="%d - %m%n" />
    </layout>
  </appender>
</log4net>
配置文件

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下載:地址 第1章 課程導學導學 第2章 小程式開發入門從幾個方面介紹小程式開發相關的內容,包括小程式開發者賬號註冊、小程式開發流程、小程式開發規範、小程式常用的API,例如網路請求、本地緩存等API,以及小程式組件等等的知識點。 第3章 深入Django視圖層分層次介紹Django視圖層的重要知識 ...
  • 一、Python簡介 python2: 源碼不統一,有重覆 (更新維護到2020年) python3: 源碼統一,無重覆 Python是一門動態解釋型的強類型定義語言 二、變數 變數命名規則 由數字、字母、下劃線組成 不能以數字開頭 要具有描述性 要區分大小寫 禁止使用python的關鍵字(在pyc ...
  • 01-單例設計模式 第一章:單例模式核心作用 (1)保證一個類只能有一個實例(一個對象) (2)並且提供一個供外界訪問該實例的全局訪問點 第二章:常見應用場景 (1)windows的任務管理器、回收站 (2)項目中,讀取配置文件的類,一般只有一個對象。沒必要每次使用配置文件的數據都要new一個對象去 ...
  • 在python3中socket傳送文件只能傳送‘bytes'類型,如下例子: decode encode bytes > str(unicode) >bytes ...
  • 簡介 Spring基於javax.mail封裝了一套用於發送電子郵件的API,位於org.springframework.mail包下,下麵將介紹下發送普通文本郵件和基於thymeleaf模版的郵件。 普通郵件 導入javax.mail依賴 Spring配置類 郵件配置:mail.propertie ...
  • Qt在進行數據類型轉換時,容易忘記如何使用,或者是早已厭倦了百度QString轉QByteArray,QByteArray轉char ,QString轉string......。 現在分享一篇QT數據類型之間的轉換。 1、QString轉QByteArray QByteArray byte; QSt ...
  • 使用IDEA搭建Java Spring Boot Gradle工程 ...
  • 1、過濾器的兩個特征 1、他是一種特性,可以引用到控制器類和Action方法上。比如下圖 這裡控制器類和action方法都引用了過濾器,這個過濾器是用來做授權的 2、特征繼承自FilterAttribute 所以只要繼承了FilterAttribute,就可以實現自定義的過濾器 2、MVC框架的典型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...