• 从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作


    一 DBContext的构造方法,方法的重载

    二 DBContext实例中,表实体对象是怎么被加入的

    三 分部类是否破坏了单一职责

    四 分部方法从另一方面定义了类型的操作规范

    五 LINQ实体类中对属性的赋值,变化前与变化后SendPropertyChanging与SendPropertyChanged

    六 LINQTOSQL中为我们触发了SendPropertyChanging和SendPropertyChanged,它的真正用意是什么

    七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作

    这是DBML系列的最后一讲,主要内容是将DBML文件进行抽象,把DBML里所有实体类进行一个抽象,并为这个抽象提供必要的属性和增,删,改,查等方法供它的实体操作对象使用。

    今天讲的内容都发生在DATA层(DAL层),它是对Entity层的数据库进行操作,在数据库操作对象中有一个基类对象,它为其它操作类提供一个DBContext的对象,一个SubmitChanges提交方法,及一系列对实体的CURD操作。

    结构如下:

    image

    对于数据操作对象的基类,最近我把它抽象出来,作为单独的项目,因为它与具体的数据库没有关系,对于所有项目都是通用的。

    我们的基类就是RepositoryBase,看一下它的结构

    image

    它对外界提供一个代参数的构架方法,就是说,外部继承它的,必须要实现这个有一个参数的构造方法才行,主要功能是建立一个具体的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代码段,它的功能就是对数据表进行增,删,改等操作

    image

    有了这个基类,在进行某个实体的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的重中之重等等,非常感谢您的阅读,如果有问题,请给我留言!!!
  • 相关阅读:
    linux shell
    jsp应用
    JavaScript基础整理(2)
    Struts2验证框架实例
    一个Struts2的实例
    Java继承和多态实例
    VS2010webConfig配置
    html兼容性
    Linux 入门记录:一、命令行 Bash 的基本操作
    微信支付:curl 出错,错误码: 60
  • 原文地址:https://www.cnblogs.com/lori/p/2426173.html
Copyright © 2020-2023  润新知