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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~Code First构架~Data层的实现,如需转载请自行联系原博主。

目录
相关文章
|
9月前
|
存储 人工智能 关系型数据库
阿里云AnalyticDB for PostgreSQL 入选VLDB 2025:统一架构破局HTAP,Beam+Laser引擎赋能Data+AI融合新范式
在数据驱动与人工智能深度融合的时代,企业对数据仓库的需求早已超越“查得快”这一基础能力。面对传统数仓挑战,阿里云瑶池数据库AnalyticDB for PostgreSQL(简称ADB-PG)创新性地构建了统一架构下的Shared-Nothing与Shared-Storage双模融合体系,并自主研发Beam混合存储引擎与Laser向量化执行引擎,全面解决HTAP场景下性能、弹性、成本与实时性的矛盾。 近日,相关研究成果发表于在英国伦敦召开的数据库领域顶级会议 VLDB 2025,标志着中国自研云数仓技术再次登上国际舞台。
1083 1
|
缓存 并行计算 Java
软件架构一致性问题之多轮对话场景中出现模型的First Token Time(FTT)变长如何解决
软件架构一致性问题之多轮对话场景中出现模型的First Token Time(FTT)变长如何解决
220 2
|
存储 数据采集 大数据
Data Lake架构揭秘
Data Lake架构揭秘
355 0
|
存储 消息中间件 SQL
Streaming Data Warehouse 存储:需求与架构
Apache Flink Table Store 项目正在开发中,欢迎大家试用和讨论。
Streaming Data Warehouse 存储:需求与架构
|
自然语言处理 数据可视化 大数据
谈谈如何从数据湖(Data Lake)架构转向数据网格(Data Mesh)架构
尽管数据网格实践被应用在有些客户中,但企业规模性的采用仍有很长的路要走。
谈谈如何从数据湖(Data Lake)架构转向数据网格(Data Mesh)架构
|
存储 数据采集 运维
关于 Data Lake 的概念、架构与应用场景介绍
本文详细介绍了 Data Lake 的概念、架构与应用场景介绍。
3786 2
关于 Data Lake 的概念、架构与应用场景介绍
|
存储 SQL 监控
Sentry 监控 - Snuba 数据中台架构(Data Model 简介)
Sentry 监控 - Snuba 数据中台架构(Data Model 简介)
542 0
Sentry 监控 - Snuba 数据中台架构(Data Model 简介)
|
Web App开发 前端开发 IDE
QCon 2022·上海站 | 学习笔记6: 前后端分离的架构 在 VS Code 中的应用
QCon 2022·上海站 | 学习笔记6: 前后端分离的架构 在 VS Code 中的应用
671 2
|
Oracle Java 关系型数据库
华为云aarch64架构下载jdk;Linux上jdk无法执行二进制文件及​gzip: stdin: invalid compressed data–format violated​报错
华为云aarch64架构下载jdk;Linux上jdk无法执行二进制文件及​gzip: stdin: invalid compressed data–format violated​报错
1610 0
|
存储 传感器 SQL
【数据湖架构】Azure Data Lake数据湖指南(下)
【数据湖架构】Azure Data Lake数据湖指南