EF的Code First開始模式時,在設計Data層與Data First模式稍微有些不同,它主要有數據庫類,數據庫操作基類,數據通用操作接口和數據通過操作實現組成,每個類有自己的用途,先看一下最簡單的結構:
DataContext是EF的數據庫對象類型,它里面的代碼構架了我們的數據表對象
public class DataContext : DbContext, IDataContext { #region Properties /// <summary> /// 得ì?到ì?UserBase結¨¢果?集?¥ /// </summary> public IDbSet<UserBase> UserBases { get; private set; } /// <summary> /// 得ì?到ì?UserInfo結¨¢果?集?¥ /// </summary> public IDbSet<UserInfo> UserInfos { get; private set; } /// <summary> /// 得ì?到ì?Category結¨¢果?集?¥ /// </summary> public IDbSet<Category> Categorys { get; private set; } #endregion #region Constructors public DataContext() : base(DataContext.GetConnectionString()) { InitDbSets(); } public DataContext(string cs) : base(cs) { InitDbSets(); } #endregion #region Private Methods private void InitDbSets() { UserBases = this.Set<UserBase>(); UserInfos = this.Set<UserInfo>(); Categorys = this.Set<Category>(); Init();//數oy據Y庫a與??DBContext依°¨¤附?方¤?式o? ? } /// <summary> /// 得ì?到ì?數oy據Y連¢?接¨?串?? /// </summary> /// <returns></returns> private static string GetConnectionString() { string conn; if (System.Diagnostics.Debugger.IsAttached) { conn = VConfigs.WebInfoConfig.Get_Config().DevsSqlConn; } else { conn = VConfigs.WebInfoConfig.Get_Config().ReleaseSqlConn; } return conn; } /// <summary> /// 根¨′據Y傳??入¨?的ì?類¤¨¤型¨a,ê?進?行DDBContext出?始o?化?¥ /// </summary> /// <param name="InitType"></param> private static void SetInitializer(InitializerTypes InitType) { switch (InitType) { case InitializerTypes.Standard: Database.SetInitializer(new CreateDatabaseIfNotExists<DataContext>()); break; case InitializerTypes.ReCreateAlways: Database.SetInitializer(new DropCreateDatabaseAlways<DataContext>()); break; case InitializerTypes.ReCreateByChange: Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DataContext>()); break; default: break; } } /// <summary> /// DBContext初?始o?化?¥方¤?法¤?§ /// </summary> private static void Init() { Database.DefaultConnectionFactory = new SqlConnectionFactory(); if (System.Diagnostics.Debugger.IsAttached) { DataContext.SetInitializer(InitializerTypes.ReCreateByChange); } else { DataContext.SetInitializer(InitializerTypes.Standard); } } #endregion /// <summary> /// 數oy據Y庫a建?§立¢?é時o?à執??行D /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { } }
其中dataBase就是數據庫操作基類,主要實現創建dbcontext對象和對修改進行統一提交的作用
/// <summary> /// 數oy據Y庫a基¨′類¤¨¤ /// </summary> public abstract class DataBase { #region 單죤件t模?ê式o?創???建?§一°?個?類¤¨¤對?象¨? /// <summary> /// 數oy據Y源??對?象¨? /// </summary> private static DataContext _db = null; protected static DataContext CreateInstance() { if (_db == null) _db = new DataContext(); return _db; } #endregion /// <summary> /// 數oy據Y庫a訪¤?問¨o對?象¨? /// </summary> protected DataContext Db = CreateInstance(); /// <summary> /// 統a3一°?提?¨¢交?動?¥作á?? /// </summary> protected virtual void SubmitChanges() { try { Db.SaveChanges(); } catch (Exception ex) { throw; } } }
而數據操作統一接口主要實現對數據庫的CURD操作,代碼一般是這樣(與其它構架大同小異)
/// <summary> /// 通a?§用??數oy據Y庫a訪¤?問¨o接¨?口¨2 /// </summary> public interface IRepository<TEntity> where TEntity : Entity.BaseEntity { /// <summary> /// 根¨′據Y數oy據Y庫a實o|ì體??-a》?¤更¨1新?記?錄? /// </summary> /// <param name="entity"></param> void Update(TEntity entity); /// <summary> /// 根¨′據Y數oy據Y庫a實o|ì體??-a》?¤[批¨2量¢?]更¨1新?記?錄? /// </summary> /// <param name="entity"></param> void Update(IList<TEntity> list); /// <summary> /// 根¨′據Y數oy據Y庫a實o|ì體??-a》?¤插?入¨?記?錄? /// </summary> void Insert(TEntity entity); /// <summary> /// 根¨′據Y數oy據Y庫a實o|ì體??-a》?¤[批¨2量¢?]插?入¨?記?錄? /// </summary> void Insert(IList<TEntity> list); /// <summary> /// 根¨′據Y數oy據Y庫a實o|ì體??-a》?¤插?入¨?記?錄?並?é返¤|ì回?剛?剛?立¢?é即??插?入¨?的ì?狀á??態??視o¨?圖a? /// </summary> TEntity InsertGetIDENTITY(TEntity entity); /// <summary> /// 根¨′據Y數oy據Y庫a實o|ì體??-a》?¤多¨¤主??鍵¨1,刪|?除y有?D多¨¤個?參?數oy控?制?的ì?對?象¨? /// </summary> /// <param name="oArr"></param> void Delete(TEntity entity); /// <summary> /// 返¤|ì回?默?認¨?結¨¢果?集?¥ /// </summary> /// <returns></returns> IQueryable<TEntity> GetModel(); /// <summary> /// 根¨′據Y主??鍵¨1返¤|ì回?實o|ì體?? /// </summary> /// <returns></returns> TEntity GetModelById(int id); }
事實上我們真實的datacontext對象在實現開發中只有Data本層可見,而對於業務層和UI層是不被容許訪問的,當然這也是保存原數據對象及方便擴展和維護的一種作法。