EF架构~终于自己架构了一个相对完整的EF方案
EF4.1学了有段时间了,没有静下来好好研究它的架构,今天有空正好把它的架构及数据操作这段拿出来,希望给大家带来帮助,对我自己也是一种总结:P
从图中可以看到,我们用的是MVC3进行程序开发的,哈哈,也是刚开始用3.0,项目整体架构还是传统三层,其它公用层我就不说了,服务层和UI层也不说了,单说EF还在的实体层和数据层,我用EF生成器把它生成后,又整理了一个,因为我不想让EF的低层方法暴露给业务层.
我来一个一个的说我的方案:
OAContext.cs:这是生成器生成的,这不作修
RepositoryBase.cs:这是数据库基类,里面对它的子类公开了一个属性和一个方法,
属性就是OAContext的实例,而方法就是SaveChanges的一个封装,子类可以根据自己的逻辑去复写它.
IRepository.cs:这是提供更新操作的统一接口,需要有更新需要的子类去实现,EF的统一更新我还没有想出来,哈哈
IEntityRepository.cs:这是统一的数据操作接口,除了更新之外的所有操作,统一操作接口是一个泛型接口
EntityRepository.cs:对统一操作接口的实现
好了,下面我把源代码公开,大家可以看一下,有好的建设请和我联系!
RepositoryBase.cs
1 /// <summary> 2 3 /// 数据操作基类 4 5 /// </summary> 6 7 public abstract class RepositoryBase 8 9 { 10 11 #region 单件模式创建一个类对象 12 13 /// <summary> 14 15 /// 数据源对象 16 17 /// </summary> 18 19 private static OAContext dbContext = null; 20 21 protected static OAContext CreateInstance() 22 23 { 24 25 if (dbContext == null) 26 27 dbContext = new OAContext(); 28 29 return dbContext; 30 31 } 32 33 #endregion 34 35 36 37 public OAContext _db = CreateInstance(); 38 39 40 41 /// <summary> 42 43 /// 存储变化 service层可能也会使用本方法,所以声明为public 44 45 /// </summary> 46 47 public virtual void SaveChanges() 48 49 { 50 51 this._db.Configuration.ValidateOnSaveEnabled = false; 52 53 this._db.SaveChanges(); 54 55 } 56 57 }
IRepository.CS
1 /// <summary> 2 3 /// 数据操作统一接口(更新) 4 5 /// </summary> 6 7 public interface IRepository<TEntity> where TEntity : class //这里使用泛型接口 8 9 { 10 11 /// <summary> 12 13 /// 根据数据库实体—》更新记录 14 15 /// </summary> 16 17 /// <param name="entity"></param> 18 19 void Update(TEntity entity); 20 21 22 23 /// <summary> 24 25 /// 根据响应的属性名称进行更新 26 27 /// </summary> 28 29 /// <param name="entity">要更新的实体</param> 30 31 /// <param name="enums">要响应的列枚举</param> 32 33 void Update(TEntity entity, Enum enums); 34 35 36 37 /// <summary> 38 39 /// 根据数据库实体—》[批量]更新记录 40 41 /// </summary> 42 43 /// <param name="entity"></param> 44 45 void Update(IList<TEntity> list); 46 47 48 49 /// <summary> 50 51 /// 根据响应的属性名称进行批量更新 52 53 /// </summary> 54 55 /// <param name="list">要更新的实体IList<IDataEntity></param> 56 57 /// <param name="enums">要响应的列枚举</param> 58 59 void Update(IList<TEntity> list, Enum enums); 60 61 }
IEntityRepository.cs
1 /// <summary> 2 3 /// 数据操作统一接口(插入,查詢,刪除) 4 5 /// </summary> 6 7 public interface IEntityRepository<TEntity> where TEntity : class //这里使用泛型接口 8 9 { 10 11 12 13 /// <summary> 14 15 /// 根据数据库实体—》插入记录 16 17 /// </summary> 18 19 void Insert(TEntity entity); 20 21 22 23 /// <summary> 24 25 /// 根据数据库实体—》[批量]插入记录 26 27 /// </summary> 28 29 void Insert(IList<TEntity> list); 30 31 32 33 /// <summary> 34 35 /// 删除单条记录 36 37 /// </summary> 38 39 /// <param name="oArr"></param> 40 41 void Delete(TEntity entity); 42 43 44 45 /// <summary> 46 47 /// 删除列表 48 49 /// </summary> 50 51 /// <param name="list"></param> 52 53 void Delete(IList<TEntity> list); 54 55 56 57 /// <summary> 58 59 /// 得到实体列表 60 61 /// </summary> 62 63 /// <returns></returns> 64 65 DbSet<TEntity> GetList(); 66 67 }
EntityRepository.cs
1 /// <summary> 2 3 /// 数据操作实现类(统一实现类) 4 5 /// </summary> 6 7 /// <typeparam name="TEntity"></typeparam> 8 9 public class EntityRepository<TEntity> : RepositoryBase, IEntityRepository<TEntity> 10 11 where TEntity : class 12 13 { 14 15 #region IEntityRepository<TEntity> Members 16 17 18 19 public void Insert(TEntity entity) 20 21 { 22 23 this._db.Set<TEntity>().Add(entity); 24 25 this._db.Entry(entity).State = System.Data.EntityState.Added; 26 27 this.SaveChanges(); 28 29 } 30 31 32 33 public void Insert(IList<TEntity> list) 34 35 { 36 37 list.ToList().ForEach(entity => 38 39 { 40 41 this._db.Set<TEntity>().Add(entity); 42 43 this._db.Entry(entity).State = System.Data.EntityState.Added; 44 45 }); 46 47 this.SaveChanges(); 48 49 } 50 51 52 53 public void Delete(TEntity entity) 54 55 { 56 57 this._db.Set<TEntity>().Remove(entity); 58 59 this._db.Entry(entity).State = System.Data.EntityState.Deleted; 60 61 this.SaveChanges(); 62 63 } 64 65 66 67 public void Delete(IList<TEntity> list) 68 69 { 70 71 list.ToList().ForEach(entity => 72 73 { 74 75 this._db.Set<TEntity>().Remove(entity); 76 77 this._db.Entry(entity).State = System.Data.EntityState.Deleted; 78 79 }); 80 81 this.SaveChanges(); 82 83 } 84 85 86 87 public System.Data.Entity.DbSet<TEntity> GetList() 88 89 { 90 91 return this.DbSet; 92 93 } 94 95 96 97 /// <summary> 98 99 /// 泛型数据表属性 100 101 /// </summary> 102 103 protected DbSet<TEntity> DbSet 104 105 { 106 107 get { return this._db.Set<TEntity>(); } 108 109 } 110 111 #endregion 112 113 114 115 /// <summary> 116 117 /// 操作提交 118 119 /// </summary> 120 121 public override void SaveChanges() 122 123 { 124 125 base.SaveChanges(); 126 127 } 128 129 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了