EF架(jia)構(gou)~Code First構(gou)架(jia)~Data層的(de)實現
EF的(de)(de)Code First開始(shi)模(mo)式時,在設計Data層與Data First模(mo)式稍微有些不同,它主(zhu)要有數(shu)(shu)據(ju)(ju)庫類,數(shu)(shu)據(ju)(ju)庫操(cao)作基類,數(shu)(shu)據(ju)(ju)通(tong)(tong)用操(cao)作接口和數(shu)(shu)據(ju)(ju)通(tong)(tong)過操(cao)作實(shi)現組成,每個類有自己的(de)(de)用途,先(xian)看一下最簡(jian)單的(de)(de)結構:
DataContext是(shi)EF的數據庫(ku)對象類(lei)型,它里面的代(dai)碼構(gou)架了我們(men)的數據表對象
public class DataContext : DbContext, IDataContext { #region Properties /// <summary> /// 得(de)ì?到ì?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();//數(shu)oy據Y庫(ku)a與??DBContext依(yi)°¨¤附?方¤?式o? ? } /// <summary> /// 得ì?到ì?數oy據Y連¢?接(jie)¨?串(chuan)?? /// </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傳(chuan)??入¨?的(de)ì?類¤¨¤型(xing)¨a,ê?進?行DDBContext出?始o?化(hua)?¥ /// </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建(jian)?§立¢?é時o?à執??行(xing)D /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { } }
其中dataBase就是數據庫操作基類,主(zhu)要實現創建(jian)dbcontext對象和(he)對修改進(jin)行統一提(ti)交(jiao)的作用
/// <summary> /// 數oy據Y庫a基¨′類(lei)¤¨¤ /// </summary> public abstract class DataBase { #region 單죤件t模?ê式o?創???建?§一°?個?類¤¨¤對?象¨? /// <summary> /// 數oy據(ju)Y源(yuan)??對?象(xiang)¨? /// </summary> private static DataContext _db = null; protected static DataContext CreateInstance() { if (_db == null) _db = new DataContext(); return _db; } #endregion /// <summary> /// 數(shu)oy據Y庫a訪¤?問¨o對?象¨? /// </summary> protected DataContext Db = CreateInstance(); /// <summary> /// 統(tong)a3一°?提?¨¢交(jiao)?動?¥作(zuo)á?? /// </summary> protected virtual void SubmitChanges() { try { Db.SaveChanges(); } catch (Exception ex) { throw; } } }
而數據操(cao)作統一接(jie)口主要實現對(dui)數據庫(ku)的CURD操(cao)作,代碼一般是這樣(與其它(ta)構架大同小異(yi))
/// <summary> /// 通a?§用??數oy據Y庫a訪(fang)¤?問¨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> /// 根¨′據(ju)Y數oy據(ju)Y庫(ku)a實o|ì體??-a》?¤[批¨2量¢?]更¨1新?記?錄(lu)? /// </summary> /// <param name="entity"></param> void Update(IList<TEntity> list); /// <summary> /// 根(gen)¨′據Y數oy據Y庫(ku)a實o|ì體??-a》?¤插(cha)?入¨?記?錄? /// </summary> void Insert(TEntity entity); /// <summary> /// 根¨′據Y數oy據Y庫(ku)a實o|ì體??-a》?¤[批¨2量¢?]插?入¨?記?錄(lu)? /// </summary> void Insert(IList<TEntity> list); /// <summary> /// 根¨′據(ju)Y數(shu)oy據(ju)Y庫a實o|ì體??-a》?¤插?入(ru)¨?記(ji)?錄?并?é返¤|ì回?剛(gang)?剛(gang)?立¢?é即??插?入(ru)¨?的(de)ì?狀á??態??視(shi)o¨?圖a? /// </summary> TEntity InsertGetIDENTITY(TEntity entity); /// <summary> /// 根¨′據Y數(shu)oy據Y庫a實o|ì體??-a》?¤多¨¤主??鍵¨1,刪(shan)|?除y有?D多¨¤個?參?數(shu)oy控?制(zhi)?的(de)ì?對?象(xiang)¨? /// </summary> /// <param name="oArr"></param> void Delete(TEntity entity); /// <summary> /// 返(fan)¤|ì回(hui)?默?認¨?結(jie)¨¢果?集?¥ /// </summary> /// <returns></returns> IQueryable<TEntity> GetModel(); /// <summary> /// 根¨′據(ju)Y主(zhu)??鍵¨1返(fan)¤|ì回(hui)?實o|ì體?? /// </summary> /// <returns></returns> TEntity GetModelById(int id); }
事實(shi)上(shang)我(wo)們真實(shi)的datacontext對(dui)象在實(shi)現開發中只有Data本層(ceng)可(ke)見,而對(dui)于(yu)業(ye)務層(ceng)和UI層(ceng)是不被容許訪(fang)問的,當(dang)然這(zhe)也是保(bao)存原數據對(dui)象及方便(bian)擴展和維護的一種作(zuo)法。