zoukankan      html  css  js  c++  java
  • 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层是不被容许访问的,当然这也是保存原数据对象及方便扩展和维护的一种作法。

    回到目录

  • 相关阅读:
    物联网普而不及 仍缺杀手级应用
    05-if和switch的简单比较
    05-if使用注意
    04-关系运算符使用注意
    03-sizeof的用法
    01-scanf函数的注意点
    01-变量的内存分析
    06-自定义构造方法
    06-构造方法
    05-id的使用
  • 原文地址:https://www.cnblogs.com/lori/p/2376449.html
Copyright © 2011-2022 走看看