EF架構~Code First構架~Data層的實現


回到目錄

EF的Code First開始模式時,在設計Data層與Data First模式稍微有些不同,它主要有數據庫類,數據庫操作基類,數據通用操作接口和數據通過操作實現組成,每個類有自己的用途,先看一下最簡單的結構:

image

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層是不被容許訪問的,當然這也是保存原數據對象及方便擴展和維護的一種作法。

回到目錄


免責聲明!

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



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