五 LINQ实体类中对属性的赋值,变化前与变化后SendPropertyChanging与SendPropertyChanged
六 LINQTOSQL中为我们触发了SendPropertyChanging和SendPropertyChanged,它的真正用意是什么
七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作
这是DBML系列的最后一讲,主要内容是将DBML文件进行抽象,把DBML里所有实体类进行一个抽象,并为这个抽象提供必要的属性和增,删,改,查等方法供它的实体操作对象使用。
今天讲的内容都发生在DATA层(DAL层),它是对Entity层的数据库进行操作,在数据库操作对象中有一个基类对象,它为其它操作类提供一个DBContext的对象,一个SubmitChanges提交方法,及一系列对实体的CURD操作。
结构如下:
对于数据操作对象的基类,最近我把它抽象出来,作为单独的项目,因为它与具体的数据库没有关系,对于所有项目都是通用的。
我们的基类就是RepositoryBase,看一下它的结构
它对外界提供一个代参数的构架方法,就是说,外部继承它的,必须要实现这个有一个参数的构造方法才行,主要功能是建立一个具体的DBContext对象。
而SubmitChanges就是LINQ TO SQL默认的数据操作所使用的统一提交方法,它将捕捉到所有的并发冲突,并进行相应的处理
1 protected virtual void SubmitChanges() 2 { 3 ChangeSet cSet = DB.GetChangeSet(); 4 if (cSet.Inserts.Count > 0 5 || cSet.Updates.Count > 0 6 || cSet.Deletes.Count > 0) 7 { 8 try 9 { 10 DB.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); 11 } 12 catch (System.Data.Linq.ChangeConflictException ex) 13 { 14 foreach (System.Data.Linq.ObjectChangeConflict occ in DB.ChangeConflicts) 15 { 16 occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 17 occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues); 18 occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges); 19 } 20 DB.SubmitChanges(); 21 } 22 } 23 } 24 25 //在Get Entity and MetaTable代码段中,主要是得到简单的实体结果集和根据主键获得一个实体对象的操作 26 27 protected virtual TEntity Find<TEntity>(params object[] keyValues) where TEntity : class 28 { 29 var mapping = DB.Mapping.GetTable(typeof(TEntity)); 30 var keys = mapping.RowType.IdentityMembers.Select((m, i) => m.Name + " = @" + i).ToArray(); 31 TEntity entityTEntity = DB.GetTable<TEntity>().Where(String.Join(" && ", keys), keyValues).FirstOrDefault(); 32 if (entityTEntity != null) 33 DB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, entityTEntity); 34 return entityTEntity; 35 36 } 37 protected virtual IQueryable<TEntity> GetEntities<TEntity>(Expression<Func<TEntity, bool>> queryFunc) where TEntity : class 38 { 39 Debug.Assert(queryFunc != null, "expression passed in is null"); 40 var results = DB.GetTable<TEntity>().Where(queryFunc); 41 return results; 42 } 43 protected virtual IQueryable<TEntity> GetEntities<TEntity>() where TEntity : class 44 45 { 46 return DB.GetTable<TEntity>(); 47 }
接下来,就是Delete,Insert,Update代码段,它的功能就是对数据表进行增,删,改等操作
有了这个基类,在进行某个实体的CURD操作时,只需要继承它一下,然后根据自己的逻辑去实现就可以了,例如:
1 public class UserRepository : TESTRepositoryBase, IUserRepository 2 { 3 4 #region IUserRepository 成员 5 public void RegisterUser(Entity.TEST.UserBases entity) 6 { 7 base.InsertEntity(entity); 8 } 9 public void UpdateUser(UserBases entity) 10 { 11 DB.SubmitChanges(); 12 } 13 14 #endregion 15 16 #region IRepository<UserBases> 成é员± 17 18 public void Update(UserBases entity) 19 { 20 base.UpdateEntity(entity); 21 } 22 23 public void Update(IList<UserBases> list) 24 { 25 list.ToList().ForEach(entity => { this.Update(entity); }); 26 } 27 28 public void Insert(UserBases entity) 29 { 30 base.InsertEntity(entity); 31 } 32 33 public void Insert(IList<UserBases> list) 34 { 35 list.ToList().ForEach(entity => { this.Insert(entity); }); 36 } 37 38 public UserBases InsertGetIDENTITY(UserBases entity) 39 { 40 base.InsertEntity(entity); 41 return base.Find<UserBases>(entity.UserID); 42 } 43 44 public void Delete(UserBases entity) 45 { 46 base.DeleteEntity(entity); 47 } 48 49 public void Delete(IList<UserBases> list) 50 { 51 list.ToList().ForEach(entity => { this.Delete(entity); }); 52 } 53 54 public IQueryable<UserBases> GetModel() 55 { 56 return base.GetEntities<UserBases>(); 57 } 58 59 public UserBases Find(params object[] keyValues) 60 { 61 return base.Find<UserBases>(keyValues); 62 } 63 64 #endregion 65 }
这个用户操作底层就写好了,它可以有自己的操作逻辑,相当它也必须实现最基础的操作方法,这个最基础的操作规定,是由接口IRepository来决定的。
我们用七讲来学习了LINQ TO SQL,其主线就是DBML文件,在学习过程中也讲了一些.net的基础知识及.NET的重中之重等等,非常感谢您的阅读,如果有问题,请给我留言!!!
本文转自博客园张占岭(仓储大叔)的博客,原文链接:从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作,如需转载请自行联系原博主。