博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF架构~Code First构架~Data层的实现
阅读量:6211 次
发布时间:2019-06-21

本文共 4648 字,大约阅读时间需要 15 分钟。

EF的Code First开始模式时,在设计Data层与Data First模式稍微有些不同,它主要有数据库类,数据库操作基类,数据通用操作接口和数据通过操作实现组成,每个类有自己的用途,先看一下最简单的结构:

DataContext是EF的数据库对象类型,它里面的代码构架了我们的数据表对象

public class DataContext : DbContext, IDataContext    {        #region Properties        ///         /// 得ì?到ì?UserBase结¨¢果?集?¥        ///         public IDbSet
UserBases { get; private set; } ///
/// 得ì?到ì?UserInfo结¨¢果?集?¥ /// public IDbSet
UserInfos { get; private set; } ///
/// 得ì?到ì?Category结¨¢果?集?¥ /// public IDbSet
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
(); UserInfos = this.Set
(); Categorys = this.Set
(); Init();//数oy据Y库a与??DBContext依°¨¤附?方¤?式o? ? } ///
/// 得ì?到ì?数oy据Y连¢?接¨?串?? /// ///
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; } ///
/// 根¨′据Y传??入¨?的ì?类¤¨¤型¨a,ê?进?行DDBContext出?始o?化?¥ /// ///
private static void SetInitializer(InitializerTypes InitType) { switch (InitType) { case InitializerTypes.Standard: Database.SetInitializer(new CreateDatabaseIfNotExists
()); break; case InitializerTypes.ReCreateAlways: Database.SetInitializer(new DropCreateDatabaseAlways
()); break; case InitializerTypes.ReCreateByChange: Database.SetInitializer(new DropCreateDatabaseIfModelChanges
()); break; default: break; } } ///
/// DBContext初?始o?化?¥方¤?法¤?§ /// private static void Init() { Database.DefaultConnectionFactory = new SqlConnectionFactory(); if (System.Diagnostics.Debugger.IsAttached) { DataContext.SetInitializer(InitializerTypes.ReCreateByChange); } else { DataContext.SetInitializer(InitializerTypes.Standard); } } #endregion ///
/// 数oy据Y库a建?§立¢?é时o?à执??行D /// ///
protected override void OnModelCreating(DbModelBuilder modelBuilder) { } }

其中dataBase就是数据库操作基类,主要实现创建dbcontext对象和对修改进行统一提交的作用

///     /// 数oy据Y库a基¨′类¤¨¤    ///     public abstract class DataBase    {        #region 单죤件t模?ê式o?创???建?§一°?个?类¤¨¤对?象¨?        ///         /// 数oy据Y源??对?象¨?        ///         private static DataContext _db = null;        protected static DataContext CreateInstance()        {            if (_db == null)                _db = new DataContext();            return _db;        }        #endregion        ///         /// 数oy据Y库a访¤?问¨o对?象¨?        ///         protected DataContext Db = CreateInstance();        ///         /// 统a3一°?提?¨¢交?动?¥作á??        ///         protected virtual void SubmitChanges()        {            try            {                Db.SaveChanges();            }            catch (Exception ex)            {                throw;            }        }    }

而数据操作统一接口主要实现对数据库的CURD操作,代码一般是这样(与其它构架大同小异)

///     /// 通a?§用??数oy据Y库a访¤?问¨o接¨?口¨2    ///     public interface IRepository
where TEntity : Entity.BaseEntity { ///
/// 根¨′据Y数oy据Y库a实o|ì体??-a》?¤更¨1新?记?录? /// ///
void Update(TEntity entity); ///
/// 根¨′据Y数oy据Y库a实o|ì体??-a》?¤[批¨2量¢?]更¨1新?记?录? /// ///
void Update(IList
list); ///
/// 根¨′据Y数oy据Y库a实o|ì体??-a》?¤插?入¨?记?录? /// void Insert(TEntity entity); ///
/// 根¨′据Y数oy据Y库a实o|ì体??-a》?¤[批¨2量¢?]插?入¨?记?录? /// void Insert(IList
list); ///
/// 根¨′据Y数oy据Y库a实o|ì体??-a》?¤插?入¨?记?录?并?é返¤|ì回?刚?刚?立¢?é即??插?入¨?的ì?状á??态??视o¨?图a? /// TEntity InsertGetIDENTITY(TEntity entity); ///
/// 根¨′据Y数oy据Y库a实o|ì体??-a》?¤多¨¤主??键¨1,删|?除y有?D多¨¤个?参?数oy控?制?的ì?对?象¨? /// ///
void Delete(TEntity entity); ///
/// 返¤|ì回?默?认¨?结¨¢果?集?¥ /// ///
IQueryable
GetModel(); ///
/// 根¨′据Y主??键¨1返¤|ì回?实o|ì体?? /// ///
TEntity GetModelById(int id); }

事实上我们真实的datacontext对象在实现开发中只有Data本层可见,而对于业务层和UI层是不被容许访问的,当然这也是保存原数据对象及方便扩展和维护的一种作法。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
如何在 Linux 上通过 C API 判断给定的 fd 的类型?
查看>>
Linux(CentOS)软件管理(2)- yum 在线安装
查看>>
重新定义数据库的时刻,阿里云数据库专家带你了解POLARDB
查看>>
【跃迁之路】【469天】刻意练习系列228(2018.05.20)
查看>>
如何修复UITextField在iOS10文字下沉问题
查看>>
一个简单的 laravel5 + vue 单页面博客
查看>>
前端进阶:二进制数据的操控----附项目代码
查看>>
阿里Java研发工程师实习面经,附面试技巧
查看>>
《深入理解Java虚拟机:JVM高级特性与最佳实践》第二章 Java内存区域与内存溢出异常 读书笔记...
查看>>
从零开始教你用vue-cli一招引入jq和boostrap
查看>>
Mybatis【一对多、多对一、多对多】知识要点
查看>>
在javascript中安全地访问深层嵌套的值
查看>>
leetcode 312. Burst Balloons
查看>>
clip实现圆环进度条
查看>>
阿里巴巴敏捷研发的探索与实践
查看>>
深入浅出面向对象和原型【概念篇2】
查看>>
开机动画
查看>>
前后端分离实践
查看>>
基于nodejs环境用Phaser来制作一个html5游戏
查看>>
Python入门学习(一)
查看>>