【IT168技术文档】
简介
本教程在前一篇《NBearV3 Step by Step教程——ORM篇》的基础上,演示前文中没有涉及的实体自关联关系;及和性能相关的Attribute的设置:IndexProperty,BatchUpdate;并将详细比较和讨论NBear.Data.Gateway类中的强类型查询方法的使用和注意事项,特别是在不同的Attribute设置选项下的性能差异分析。
注:在阅读本文之前,建议读者先阅读《NBearV3 Step by Step教程——ORM篇》以掌握NBearV3中有关ORM的基本知识。
目标
通过本教程,读者应能够更全面地掌握使用NBearV3的ORM模块进行应用程序设计的过程,了解实体设计中与性能相关的重要选项,并能全面掌握NBear.Data.Gateway中各种强类型查询方法的使用。
代码
本教程演示创建的所有工程和代码,包含于可以从sf.net下载的NBearV3最新源码zip包中的tutorials\ORM_Adv_Tutorial目录中。因此,在使用本教程的过程中如有任何疑问,可以直接参考这些代码。
Step 1 下载NBearV3最新版本及准备
1.1访问http://sf.net/projects/nbear,下载NBearV3的最新版本到本地目录。
1.2 将下载的zip文件解压至C:\,您将看到,加压后的NBearV3目录中包括:dist、doc、cases、src、tutorials等目录。其中,在本教程中将会使用的是dist目录中的所有release编译版本的dll和exe和tutorials目录中之前的ORM基础教程。
1.3 将tutorials目录中的整个ORM_Tutorial目录复制到任意其它位置,并命名为ORM_Adv_Tutorial,我们将以ORM_Tutorial为基础,演示NBearV3中的ORM的进阶知识。
Step 2 扩展设计实体及元数据
2.1 将ORM_Adv_Tutorial中的ORM_Tutorial.sln重命名为ORM_Adv_Tutorial.sln,并在VS2005开发环境中打开。
2.2 在EntityDesigns工程的Group.cs文件中,添加ParentID属性,并为ParentID属性添加IndexPropertyAttribute设置如下:
[IndexProperty] Guid ParentID { get; set; }
将属性标记为IndexProperty,表示在NBear.Tools.EntityDesignToEntity.exe生成的数据库创建脚本中,将自动为该属性创建一个单列索引。我们都理解数据库索引的作用——这将有助于改善以该属性为条件的查询性能。
2.3 还是在Group.cs文件中,我们为Group新增一个SubGroups属性如下:
[FkQuery("ParentID", Contained=true, LazyLoad=true)] Group[] SubGroups { get; set; }
可以看到,SubGroups属性的设置方式和普通的1对多关联的属性设置方式没什么两样,但是,可以注意到,它其实是Group实体1对多关联到Group实体自己,也就是说,它是一个1对多的自关联。
注:对于1对1自关联,也可以以类似的方式设置。但是,NBearV3还不支持多对多的自关联,也不支持一个继承体系中的类的多对多关联,例如,不支持User和LocalUser的多对多关联。
2.4 在User.cs文件和LocalUser.cs中,为User和LocalUser实体添加一个BatchUpdateAttribute如下:
[BatchUpdate(10)] public interface User : Entity { \\ } [BatchUpdate(10)] public interface LocalUser : User { \\ }
BatchUpdate这个Attribute对于该实体的查询性能将有重要影响。当使用BatchUpdate标记一个实体时,实体的Save和Delete级联操作,将在内部自动使用一个BatchGateway,以批更新方式执行。BatchUpdate的构造参数代表每多少个作为一个batch,连接数据库,并执行。举例来说,假如原来,User实体的一个实例Delete的时候,由于User实体自己,及所有User中以Contained这个Attribute标记的属性对象的数量一共有20个应该被自动Delete掉,那么,要连接20次数据库,执行20次Delete;而在设置了BatchUpdate(10)的情况下,因为每十个查询才连接一次数据库,所以,实际上,只需要连接两次数据库,每次分别发送并执行10个Delete操作。很显然,BatchUpdate对性能的改善是惊人的。