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

从微软的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的重中之重等等,非常感谢您的阅读,如果有问题,请给我留言!!!

转载于:https://www.cnblogs.com/lori/archive/2012/03/30/2426173.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110442.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSON数组转Java List

    JSON数组转Java List本文使用alibaba开源项目fastjson与SourceForge开源项目JSON-lib两种方法转换json。现有json文件user.json如下:[{“userid”:”309BCCE3-8525-4D33-9856-5084E24FD96F”,”username”:”林梦”,”password”:”19bdec7440acd44c669

    2022年8月23日
    2
  • EXCEL 出错 8000401a

    EXCEL 出错 8000401a检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误:8000401a先用骨哥狗了一会,没解决方案,又用摆渡,也没找到方法,最后还是看微软的帮助解决了问题:1.打开DCOM配置,取消交互式用户,使用启动用户2.安全中附足够权限,不知道用户是谁就写Everyonehttp://suppo…

    2022年7月25日
    7
  • 基于STC89C51/2的的超声波测距(1602A显示)「建议收藏」

    基于STC89C51/2的的超声波测距(1602A显示)「建议收藏」基于STC89C51/2的的超声波测距(1602A显示) 楼主在做学校单片机设计的时候为了测试超声波模块的功能与精度,动手DIY一款能用的超声波测距仪器,用1602液晶显示屏动态显示,精度在0.5cm左右,粗略测距,可用于避障,检测距离等的实际用途中。 我的超声波模块使用的是HC-SR04,板子使用的是STC89C52RC学习版(理论上51和52均可使 用)。得到距离之后可用于扩展功能,之后有空可以把我的经验分享出来,欢迎讨论。我的引脚接口如下ECHO=P2^4;

    2022年9月15日
    0
  • 什么是dll_dll文件怎么打开编辑

    什么是dll_dll文件怎么打开编辑   DLL的概念    DLL(DynamicLinkLibrary)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使…

    2022年4月18日
    37
  • mysql longtext_MySql中LongText类型大字段查询优化

    mysql longtext_MySql中LongText类型大字段查询优化在本次项目表结构中,有一个longtext字段,用于存储长文本,仅万条数据,InnoDB存储文件就达G级,由于是一个小项目,受限于服务器与运维人员水平,不适合使用hdfs,MongoDB等拓展技术栈来解决这种问题,因此直接对mysql存储进行优化,快速解决,利于维护。涉及mysql基础知识一、innodb存储引擎的处理方式1.mysql在操作数据的时候,以page为单位不管是更新,插入,删除一行数…

    2022年5月15日
    44
  • freemarker 加载远程模板「建议收藏」

    freemarker 加载远程模板「建议收藏」freemarker 加载远程模板

    2022年4月20日
    80

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号