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