我們已經根據設計好的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中使用
至此,數據庫訪問層搭建基本完成。可以只能