IRoleRepository : IDisposable 2 { 3 //IEnumerable和IQueryable 4 //二者在EF都会延迟加载,不同的是: 5 //IEnumerable是数据加载到内存,刷选在内存中的数据上执行 6 //IQueryable是查询和刷选在数据源中执行 TODO:复杂条件查询和异步方法 IEnumerable<Role> GetRoles(); 12 Role GetRole(int? id); 13 void Create(Role role); 14 void Update(Role role); 15 void Delete(int? id); 16 }
其实现代码:
RoleRepository : IRoleRepository 2 { 3 private EFContext db; 4 public RoleRepository(EFContext _db) 5 { 6 db = _db; 7 } IEnumerable<Role> GetRoles() 10 { 11 return db.Roles.ToList(); 12 } Role GetRole(int? id) 15 { 16 return db.Roles.Single(m => m.Id == id); 17 } Create(Role role) 20 { 21 db.Roles.Add(role); 22 db.SaveChanges(); 23 } Delete(int? id) 26 { 27 db.Roles.Remove(db.Roles.Single(m => m.Id == id)); 28 db.SaveChanges(); 29 } Update(Role role) 32 { 33 db.Update(role); 34 db.SaveChanges(); 35 } public void Save() 38 //{ 39 // db.SaveChanges(); 释放资源 disposed = false; Dispose(bool disposing) 45 { 46 if (!disposed) 47 { 48 if (disposing) { db.Dispose(); } 49 } 50 disposed = true; 51 } Dispose() 53 { 54 Dispose(true); 55 System.GC.SuppressFinalize(this); 56 } }
9.工作单元模式
工作单元的目的,保证多个数据仓库一起操作保持一致。先创建接口:
IUnitOfWork 2 { SaveChanges(); 5 }
其实现:
UnitOfWork : DbContext, IUnitOfWork 2 { SaveChanges() 4 { 5 base.SaveChanges(); 6 } 7 }
10.仓库基类封装
基类封装:
BaseRepository 2 { 3 protected IUnitOfWork UnitOfWork { get; set; } EFContext db 6 { 7 get { return (EFContext)UnitOfWork; } 8 } BaseRepository(IUnitOfWork _unitOfWork) 11 { 12 if (_unitOfWork == null) 13 { ArgumentNullException(); 15 } 16 17 UnitOfWork = _unitOfWork; 18 } Save() 21 { 22 db.SaveChanges(); 23 } DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class 26 { 27 return db.Set<TEntity>(); 28 } SetEntityState(object entity, EntityState entityState) 31 { 32 db.Entry(entity).State = entityState; 33 } 34 }
11.小结
篇幅有些长了,下一章再说控制器基类封装,依赖注入,界面展示……