數據訪問層DAL


 

我們已經根據設計好的pdm文件生成數據庫,下面我們一起完成數據庫訪問層需要的工作

在dal類庫上點擊右鍵,添加,新建項

選擇“ADO。NET實體數據模型”,會自動命名“Model1”

 選擇“來自數據庫的EF設計器”為什么不選擇“Code First”呢?因為Oracle官方提供的EF,不支持Code First,所以有跨庫需求的,還是選擇這種最簡單的方式吧。

 

 

 先測試一下連接,再確定

 

 下面會用你“數據庫的名稱+Entities”命名,不建議修改,下面你會用到

 

 如果你的電腦沒有安裝其他版本的EF,就不會出現下面的頁面

 

 注意:不要選擇“確定所生成對象名稱的單復數形式(s)”,因為以后我們會配套代碼生成器,對其他層的代碼自動生成;

 

完成后,生成如下的3個文件, 這3個文件都分別什么作用呢?

好,我們通過3個進一步的問題回答,

  • 1.怎么將數據庫由“Sys”變更為“HeXiao”呢?

打開“App.Config”,來配置本類庫的entity framework

 在解決方案中,雙擊打開“Model1.edmx”,然后Ctrl+A(全選),最后Delete,這樣就刪了所有的模型;

在空白處點擊右鍵,選擇“從數據庫更新模型”

 

 

 注意:這只完成了DAL類庫的修改,還有系統的配置文件沒有修改,將“App.config(只為DAL類庫使用)”中內容拷貝到“Web.config(系統級別的配置文件)”

 為什么需要一致呢?因為config文件只給其所在應用程序使用,我們做的是bs架構的系統,外面訪問的是展示層App,而在App層中的配置文件是Web.config,所以在App項目中是整個系統的所有配置文件,同理,下面的packages.config文件,也要保持一致,因為我們在DAL組件不需要再增加新的組件引用了,刪除即可。

  • 2.packages.config的作用是什么?

大家一定要清楚,作為常識

 

下面我們新建一個文件夾“Framework”,存放本類庫的公用代碼,我們還會建一個文件夾,存放本類庫的業務代碼,且為后話。

BaseRepository.cs是訪問數據庫表的基類

using System.Linq;


namespace Langben.DAL
{
    public abstract class BaseRepository<T> where T : class
    {
        #region 字段

        /// <summary>
        /// 開始時間的標識
        /// </summary>
        public string Start_Time { get { return "Start_Time"; } }
        /// <summary>
        /// 結束時間的標識
        /// </summary>
        public string End_Time { get { return "End_Time"; } }
        /// <summary>
        /// 開始數值的標識
        /// </summary>
        public string Start_Int { get { return "Start_Int"; } }
        /// <summary>
        /// 結束數值的標識
        /// </summary>
        public string End_Int { get { return "End_Int"; } }        
        ///
        /// 精確字符串
        /// </summary>
        public string DDL_String { get { return "DDL_String"; } }
        /// <summary>
        /// 精確數字
        /// </summary>
        public string DDL_Int { get { return "DDL_Int"; } }

        #endregion
     
        /// <summary>
        /// 獲取所有
        /// </summary>
        /// <param name="db">實體數據上下文</param>
        /// <returns>集合</returns>
        public virtual IQueryable<T> GetAll(SysEntities db)
        {
            return db.Set<T>().AsQueryable();
        }
        /// <summary>
        /// 創建
        /// </summary>
        /// <param name="db">實體數據上下文</param>
        /// <param name="entity">將要創建的對象</param>
        public virtual void Create(SysEntities db, T entity)
        {
            if (entity != null)
            {
                db.Set<T>().Add(entity);
            }
        }
        /// <summary>
        /// 創建
        /// </summary>
        /// <param name="entity">一個對象</param>
        /// <returns>成功了幾條數據</returns>
        public virtual int Create(T entity)
        {
            using (SysEntities db = new SysEntities())
            {
                Create(db, entity);
                return this.Save(db);
            }
        }
        /// <summary>
        /// 創建對象集合
        /// </summary>
        /// <param name="db">實體數據上下文</param>
        /// <param name="entitys">對象集合</param>
        public virtual void Create(SysEntities db, IQueryable<T> entitys)
        {
            foreach (var entity in entitys)
            {
                this.Create(db, entity);
            }
        }
        /// <summary>
        /// 編輯一個對象
        /// </summary>
        /// <param name="db">實體數據</param>
        /// <param name="entity">將要編輯的一個對象</param>
        /// <param name="isAttach">是否附加到數據庫上下文,如果對象是從數據庫查詢出來的,則為false</param>
        public virtual T Edit(SysEntities db, T entity, bool isAttach = true)
        {
            if (isAttach)
                db.Set<T>().Attach(entity);

            db.Entry(entity).State = System.Data.Entity.EntityState.Modified;
            return entity;
        }
        /// <summary>
        /// 編輯對象集合
        /// </summary>
        /// <param name="db">實體數據</param>
        /// <param name="entitys">對象集合</param>
        public virtual void Edit(SysEntities db, IQueryable<T> entitys)
        {
            foreach (T entity in entitys)
            {
                this.Edit(db, entity);
            }
        }
        /// <summary>
        /// 提交保存,持久化到數據庫
        /// </summary>
        /// <param name="db">實體數據</param>
        /// <returns>受影響行數</returns>
        public int Save(SysEntities db)
        {
            return db.SaveChanges();
        }

    }
}

 

BaseViewRepository.cs是訪問數據庫視圖的基類

 

  • 3.“Model1.edmx”整個文件有什么用?

它將數據庫映射成了我們可以在面向對象使中用的模型,包含了數據庫訪問用到的實體和數據庫訪問方法,我們約定:數據庫訪問用到的實體我們可以在其他層(BLL,IBLL,App)中使用,數據庫訪問方法只能在DAL中使用

至此,數據庫訪問層搭建基本完成。可以只能


免責聲明!

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



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