【ACCESS精品源码栏目提醒】:网学会员在ACCESS精品源码频道为大家收集整理了“【最新编排】XPO详细资料 - 其它管理文献“提供大家参考,希望对大家有所帮助!
XPO 学习一 Dev 出品的XPO是一个O/R Mapping框架虽然是商业软件非开源但提供了
源码。
况且Dev的产品一向以
精品为主值得好好研究一下我不是Dev的代理 。
于是在学习过程中做个摘要。
一、一个持久类Persistent Class一般来说映射为一个表类型该表的每一条纪录即一个持久类的实例。
持久类继承自XPObject或者XPBaseObject。
public class Customer : XPObject 创建对象就创建了一条新纪录调用基类的save就保存到库。
XPObject继承自XPBaseObject已包含Oid属性表示表的唯一自增量字段。
而XPBaseObject需要手动去作一些映射工作但提供更大的灵活性。
XPBaseObject 实现了IXPObject接口实际上假如我们自己去实现这个接口也能自动保存到数据库 也就是对象持久化了比如窗体winform的状态就可以保存。
检索一个表实际就是检索一个同类对象的集合 XPCollection 二、表间关系 支持一对一一对多多对多三种关系。
数据库的表间关系在框架内体现为持久对象之间的关系。
一般我们在设计一些类似关系的类时我们用数组或者其他集合表示方法IList等等来为类之间建立关系。
XPO使用XPCollection来表示类之间的”对多关系”。
并且附加属性来表示多对多还是一对多的关系。
一对多 在一个类中定义 public class Customer : XPObject ... AssociationquotCustomerAddressesquot typeofAddress public XPCollection Addresses get return GetCollectionquotAddressesquot ... 同时另一个类Adresses中定义 AssociationquotCustomerAddressesquot public Customer Customer 此时这个类的关联关系并没有指定关联类型因为已经说明了类型。
可以在关联关系中进一步指定其他附加属性比如级联删除关系 public class Customer : XPObject ... AssociationquotCustomerOrdersquot typeofOrder Aggregated public XPCollection Orders get return GetCollectionquotOrdersquot ... 多了Aggregated这种特性表示聚集也就是表之间的级联删除关系。
访问子表的方法 枚举 foreachOrder theOrder in theCustomer.Orders 增加子表的记录 myCustomer.Orders.AddmyOrder 三、查询 使用条件对象 比如 Freight lt 10M XPCollection orders new XPCollectiontypeofOrder new BinaryOperatorquotFreightquot 10M BinaryOperatorType.Less 这里使用了指定持久类类型的集合类XPCollection对象。
这里并不意味着只能在一个表中查。
如果这 个持久类和其他类有关 联关系的话那么条件对象可以包含对关联类的属性条件。
也就是实现了多表查询。
下面的组合查询中的Address就是Customer的一个聚集类。
复杂一点的条件使用GroupOperator。
比如BirthDate lt 01/02/1960 AND Address.Street 10th Avenue GroupOperator criteria new GroupOperator criteria.Operands.Addnew BinaryOperatorquotBirthDatequot new DateTime1960 1 2 BinaryOperatorType.Less criteria.Operands.Addnew BinaryOperatorquotAddress.Streetquot quot10th Avenuequot ... new XPCollectiontypeofCustomer criteria 以前也打算在项目中做一个类似此功能的组件当时的出发点是想做一个和具体数据库sql语法无关的条件对象用来代理sql条件语句的生成。
后来由于项目成本原因作罢。
现在终于有一个现成的了。
四、继承和多态 某种程度上也可以说是表间关系。
XPO的持久类支持完整的继承和多态。
比如管理人员是一个员工但一个员工不一定是管理人员。
这个我们在以前数据库设计时可以在员工表中加一个是否管理人员的标识或者另建一个管理人员表再通过外键让它和员工表建立关系。
XPO中就可以用OO的方式来描述此类关系建一个员工类再建一个员工类的子类管理人员类。
public class Employee : XPObject public string LastName quotquot public string FirstName quotquot AssociationquotManagerEmployeesquot public Manager Manager null public Employee public Employeestring newLastName string newFirstName LastName newLastName FirstName newFirstName public class Manager : Employee AssociationquotManagerEmployeesquot typeofEmployee public XPCollection Employees get return GetCollectionquotEmployeesquot public Manager public Managerstring newLastName string newFirstName : basenewLastName newFirstName 注意使用了关联属性。
但是这里的关联关系仅仅是表示一个管理人员所管理的下属员工管理人员。
五、Session 管理数据库的连接信息。
有一个默认的连接MS
Access OLEDB provider。
如果使用它在程序中就不必自己初始化Session的实例。
但如果想使用自己的连接两种办法一是更改默认连接的连接信息二是自己创建但在持久类构建时必须引用它。
还是第一种简单一点。
除非应用程序要考虑连接两个数据库 六、对二进制大对象字段的存取 使用延迟装载Delayed Loading 这里必须指定一个私有的XPDelayedProperty类 型的属性并且加上Attribute设计上有点繁琐。
public class Customer: XPObject ... private XPDelayedProperty document new XPDelayedProperty Delayedquotdocumentquot public Byte Attachment get return Bytedocument.Value set document.Value value 七、事务的支持 事务在数据库程序内是不可或缺的。
显然该功能是由Session提供的。
Account account new Account Session.DefaultSession.BeginTransaction try account.Amount amount account.Save Session.DefaultSession.CommitTransaction catch Exception e Session.DefaultSession.RollbackTransaction account.Reload 注意在Exception发生时使用了Reload。
八、保存之前的数据有效性检查 class Account: XPObject public double Amount DefaultAmount protected override void BeforeSave base.BeforeSave ifIsDeleted if Amount lt 0 throw new ExceptionquotNegative amountquot 注意先判断了IsDeleted。
九、并发操作 提供了检查对象在更改之前是否已经变化的检查机制。
在以前我们必须自己写代码去检查现在这也提供了。
十、数据分页机制 对大数据量我们一般都不是一次提取的而是分批提取从而减少内存使用和加快提取速度。
XPO提供了直接支持。
但是它没有使用XPCollection而是使用了另外一个类XPCusor。
使用上和XPCollection差不多也支持条件对象但就是多了个分页支持。
这个设计思想令人纳闷为什么不合二为一 十一、对结构的持久化支持 还是当前这个版本刚刚支持的。
public struct Point PersistentquotAbscissaquot public int X public int Y public class Shape: XPObject public string Name quotquot PersistentquotLocationquot public Point Position 注意使用了Attribute结构才能持久化。
XPO学习二Attribute的总结 十二、对Attribute的总结 应该看到整个XPO框架中Attribute使用的相当频繁可以列出常用的 Aggregated 没有参数 作用于a property or a field并且只能是持久类的引用或者XPCollection. 实现两个持久 类的级联删除的功能。
AssociationquotPersonAddressesquot typeof Address 作用于a property or a field 实现两个持久类的级联关系 参数1、关联的名称2、关联的持久类类型但引用指明持久类型时可以省略 MapToquotT_Personquot 作用于持久类或a property or a field 作用于持久类时指定持久类映射的表名称。
如果没有指定默认的表名就是类名。
作用于property或field时表的列名称。
参数是表名或列名是区分大小写的。
PersistentquotCreatedOnquot 强制映射字段 作用于a property or a field XPO一般只对持久类中的可写property和public field进行持久化操作。
因此对只读的field可以加上该特性进行强制持久化。
参数表名可选 NonPersistent 作用于a class property or a field 指明不对类或propertyfield进行持久化操作。
参数无。
DbType 指定列创建时使用的数据类型。
参数字符串的数据类型表示。
MapInheritanceMapInheritanceType.OwnTable 作用于持久类。
两个持久类是继承关系时持久信息的存储方式。
参数 MapInheritanceType.OwnTable 各自独立的表分别存储独有部分。
MapInheritanceType.ParentTable 都在父表存储。
Delayedquotdocumentquot 只能作用于Property。
延迟数据装载当持久类构造时并不装载数据只是property首次被访问时才装载。
和类XPDelayedProperty结合使用才能实现延迟装载的功能。
参数引用的XPDelayedProperty 类型field 名称。
SizeSizeAttribute.Unlimited 数据长度 作用范围a property or a field。
指定映射的表字段长度。
只是当创建字段时才体现。
当字段已经存在XPO此时不会检查该值。
参数数值的长度或者SizeAttribute.Unlimited不限制长度 可以不指定。
如果是string默认是100。
Key KeytrueKeyAutoGenerate true 作用于a property or a field。
指定主键。
每个持久类都需要一个指定为key的propery or field。
XPObject和XPBaseObject的一个明显差别就是XPObject已有一个OId主键 参数bool型可选。
是否由XPO自动生成键值Int或GUID。
默认是false。
Indexed 作用于a property or a field。
指定索 引。
默认情况下该索引是非唯一索引。
没有构造参数。
但可以通过set来设置为唯一索引IndexedUniquetrue OptimisticLockingfalse 作用于持久类。
是否乐观锁定感谢format 的指错。
如果锁定修改后提交时XPO会检查原始数据是否已经被改变而不是who lastest who win。
XPO在持久类映射的表类加一个系统字段“OptimisticLockField”显然是用来标记状态的。
因此如果是映射到视图时要显式设置为不锁定。
参数bool值可选默认是true ValueConvertertypeof实现转换接口抽象类ValueConverter的类 作用于property。
值和类型转换挺有意思的一个功能。
从数据库提取值和保存值都可以作一个转换工作。
NullValuequotquot 作用于简单数据类型的a property or field。
指定对应库中值为null时持久类中对应的数据。
反之也是。
参数根据不同的数据类型引入不同的参数。
看例子比较方便 public class Example : XPObject NullValueInt32.MinValue public int NullOnMinValueFieldInt NullValue0 public int NullOnZeroFieldInt NullValuequotquot public string NullOnEmptyStringFieldString NullValuequotNULLquot public string NullOnNULLFieldString 本想只列出常用的但看看代码就差两个就列完了。
ExplicitLoading MemberDesignTimeVisibility 未完 XPO的条件相关类。
XPO的条件对象用来生成数据筛选条件实际就是SQL语句条件语法树条件表达式的组合的对象表示方法。
一、主要相关类 1、继承于抽象类CriteriaOperator的类系列。
继承于CriteriaOperator的子类有 BetweenOperator 取范围的条件表达式类如1000 lt Total Price lt 2000 BinaryOperator 二元表达式类最基本的表达式比如TotalPricegt100 ContainsOperator 包含表达式类比如exists GroupOperator 组合表达式类利用它进行反复嵌套组合可以组成任意复杂的条件树。
InOperator 在某个值列表范围内的表达式可以认为是SQL中的in NotOperator 取反表达式对应SQL中的not NullOperator 取空值表达式对应SQL中的 IsNull 2、辅助CriteriaOperator的CriteriaOperand类系列。
继承于抽象类CriteriaOperand的子类有 AggregateOperand 聚 .