EF架构~Code First构架~Data层的实现
EF的Code First开始模式时,在设计Data层与Data First模式稍微有些不同,它主要有数据库类,数据库操作基类,数据通用操作接口和数据通过操作实现组成,每个类有自己的用途,先看一下最简单的结构:
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层是不被容许访问的,当然这也是保存原数据对象及方便扩展和维护的一种作法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示