[关闭]
@Aiti 2020-04-25T03:29:40.000000Z 字数 3358 阅读 288

ORM工具——XPO

ORM DevExpress XPO



1. 什么是XPO

XPO是由大名鼎鼎的DevExpress提供的一种商业的ORM工具。

从概念上来说XPO是一种简单的对象映射技术,是一种把一个普通类变成持久化类的技术。也就是让一个普通的类和数据库中的一个表对应。把表中的字段和类中的字段对应,你可以透明的将一条记录直接保存到数据库,而不需要和ADO.net打交道。

下面是XPO中的类层次结构

这些类到底有啥作用呢?

这些类提供了将一个类的自身的数据保存到数据库中的所有功能。只要你继承其中一个类,你的类就马上变成了一个可以持久化的类了。也就是具有了将类自己的数据保存到数据库的能力。

什么叫延后删除:一个持久化类,他是和数据库中的一个记录对应的,当你执行一个删除一个持久化类的动作的时候,XPO不会马上就去在数据库上执行真正的数据删除,而是将这条记录标记为删除,而且已经后不会在读取他。。当你要真正删除时,可以调用Session.PurgeDeletedObjects()来完全删除这些标记的记录

2. 继承XPO基类,使其变为持久化类

下面定义了一个消息提醒的实体类

  1. using DevExpress.Xpo;
  2. namespace TechManager.Module.Component
  3. {
  4. /// <summary>
  5. /// 消息提醒
  6. /// </summary>
  7. public class Notice : XPObject
  8. {
  9. public Notice()
  10. : base()
  11. {
  12. }
  13. public Notice(Session session)
  14. : base(session)
  15. {
  16. }
  17. [DisplayName("提醒标题")]
  18. public string Title;
  19. [DisplayName("提醒链接")]
  20. public string Url;
  21. [DisplayName("处理日期")]
  22. public DateTime Date;
  23. [DisplayName("是否失效")]
  24. public bool Invaild;
  25. }
  26. }

上面Notice类继承了XPObject基类,即继承了基类的持久化和主键OID,使其不再是一个简单的类,具备了将数据存入的功能。创建对象就创建了一条新纪录,调用基类的save就保存到库。

3. XPO的一些常用标签

  1. [Key]
  2. public string Name;
  1. [Size(20)]
  2. public string Name;
  3. [DbType("nvarchar(6)"]
  4. public string Code;
  1. [NonPersistent]
  2. public string DeptName;
  3. Private string FullCode;
  1. [Indexed(Unique = true)]
  2. public string IDNumber;
  1. [NullValue("unknownemail")]
  2. public string Email;

当输入的值是“unknownemail”时,那么写入数据库时将被替换为NULL,对象实例或者时则显示“unknownemail”;如AA为查到的此条记录,则 AA.Email 显示为“unknownemail”。数据库字段则是NULL

  1. [Association("CustomerAddress")]
  2. public Customer Customer;
  1. Class A
  2. {
  3. [Association("A_B"), Aggregated]
  4. public XPCollection<B> A_B
  5. {
  6. get { return GetCollection<B>("A_B"); }
  7. }
  8. }
  9. Class B
  10. {
  11. [Association("A_B")]
  12. public A A;
  13. }
  1. class A : XPObject
  2. {
  3. public string Name = "A";
  4. }
  5. class B : XPObject
  6. {
  7. public string Name = "B";
  8. [ExplicitLoading(3)]
  9. public A A;
  10. }
  11. class C : XPObject
  12. {
  13. public string Name = "C";
  14. [ExplicitLoading]
  15. public B B;
  16. }
  17. class D : XPObject
  18. {
  19. public string Name = "D";
  20. [ExplicitLoading]
  21. public C C;
  22. }
  23. class E : XPObject
  24. {
  25. public string Name = "E";
  26. public D D;
  27. }

我们检索到E对象时,系统会自动获取(构造)其引用的对象,当引用层数很深时,就会产生多条SQL语句。此时我们可以使用[ExplicitLoading]属性合并多个查询。在上面的例子中,D被做了属性标记,那么会自动往下递归查找有该标记的引用。因此会将 D、C、B的查询构造到同一条SQL语句中,而A依然会被单独构造SQL,我们可以将B中的属性标记加上参数3,就可以将A也加到递归中,如此D、C、B、A合并到同一条SQL语句中。注意这个Depth参数表示所引用类型距离Root的深度,A距离E有3层。

4. 表与表的关系

支持一对一,一对多,多对多三种关系。
数据库的表间关系在框架内体现为持久对象之间的关系。一般我们在设计一些类似关系的类时,我们用数组或者其他集合表示方法IList等等,来为类之间建立关系。

XPO使用XPCollection来表示类之间的”对多关系”。并且附加属性来表示多对多还是一对多的关系。

  1. "CustomerAddress" 关系名称。
  2. "Aggregated" 级联操作(删除、更新)。
  3. "Addresses" 集合属性名。
  4. 注意两个类中关系名相同。
  5. public class Customer : XPObject
  6. {
  7. public string Name;
  8. [Association("CustomerAddress", typeof(Address)), Aggregated]
  9. public XPCollection Addresses
  10. {
  11. get { return GetCollection("Addresses"); }
  12. }
  13. }
  14. public class Address : XPObject
  15. {
  16. [Association("CustomerAddress")]
  17. public Customer Customer;
  18. }
  1. public class Customer : XPObject
  2. {
  3. public string Name;
  4. [Association("CustomerType", typeof(Type)), Aggregated]
  5. public XPCollection Types
  6. {
  7. get { return GetCollection("Types"); }
  8. }
  9. }
  10. public class Type : XPObject
  11. {
  12. [Association("CustomerType", typeof(Customer))]
  13. public XPCollection Customers
  14. {
  15. get { return GetCollection("Customers"); }
  16. }
  17. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注