@Aiti
2020-04-25T03:29:40.000000Z
字数 3358
阅读 331
ORM DevExpress XPO
基本概念
普通类:就是一个简单的定义的类。
持久化类:可以把类的实例中的数据及时的保存到数据库中的类。
XPO是由大名鼎鼎的DevExpress提供的一种商业的ORM工具。
从概念上来说XPO是一种简单的对象映射技术,是一种把一个普通类变成持久化类的技术。也就是让一个普通的类和数据库中的一个表对应。把表中的字段和类中的字段对应,你可以透明的将一条记录直接保存到数据库,而不需要和ADO.net打交道。
下面是XPO中的类层次结构
这些类到底有啥作用呢?
这些类提供了将一个类的自身的数据保存到数据库中的所有功能。只要你继承其中一个类,你的类就马上变成了一个可以持久化的类了。也就是具有了将类自己的数据保存到数据库的能力。
什么叫延后删除:一个持久化类,他是和数据库中的一个记录对应的,当你执行一个删除一个持久化类的动作的时候,XPO不会马上就去在数据库上执行真正的数据删除,而是将这条记录标记为删除,而且已经后不会在读取他。。当你要真正删除时,可以调用Session.PurgeDeletedObjects()来完全删除这些标记的记录
下面定义了一个消息提醒的实体类
using DevExpress.Xpo;namespace TechManager.Module.Component{/// <summary>/// 消息提醒/// </summary>public class Notice : XPObject{public Notice(): base(){}public Notice(Session session): base(session){}[DisplayName("提醒标题")]public string Title;[DisplayName("提醒链接")]public string Url;[DisplayName("处理日期")]public DateTime Date;[DisplayName("是否失效")]public bool Invaild;}}
上面Notice类继承了XPObject基类,即继承了基类的持久化和主键OID,使其不再是一个简单的类,具备了将数据存入的功能。创建对象就创建了一条新纪录,调用基类的save就保存到库。
[Key]public string Name;
[Size(20)]public string Name;[DbType("nvarchar(6)"]public string Code;
[NonPersistent]public string DeptName;Private string FullCode;
[Indexed(Unique = true)]public string IDNumber;
[NullValue("unknownemail")]public string Email;
当输入的值是“unknownemail”时,那么写入数据库时将被替换为NULL,对象实例或者时则显示“unknownemail”;如AA为查到的此条记录,则 AA.Email 显示为“unknownemail”。数据库字段则是NULL
[Association("CustomerAddress")]public Customer Customer;
Class A{[Association("A_B"), Aggregated]public XPCollection<B> A_B{get { return GetCollection<B>("A_B"); }}}Class B{[Association("A_B")]public A A;}
class A : XPObject{public string Name = "A";}class B : XPObject{public string Name = "B";[ExplicitLoading(3)]public A A;}class C : XPObject{public string Name = "C";[ExplicitLoading]public B B;}class D : XPObject{public string Name = "D";[ExplicitLoading]public C C;}class E : XPObject{public string Name = "E";public D D;}
我们检索到E对象时,系统会自动获取(构造)其引用的对象,当引用层数很深时,就会产生多条SQL语句。此时我们可以使用[ExplicitLoading]属性合并多个查询。在上面的例子中,D被做了属性标记,那么会自动往下递归查找有该标记的引用。因此会将 D、C、B的查询构造到同一条SQL语句中,而A依然会被单独构造SQL,我们可以将B中的属性标记加上参数3,就可以将A也加到递归中,如此D、C、B、A合并到同一条SQL语句中。注意这个Depth参数表示所引用类型距离Root的深度,A距离E有3层。
支持一对一,一对多,多对多三种关系。
数据库的表间关系在框架内体现为持久对象之间的关系。一般我们在设计一些类似关系的类时,我们用数组或者其他集合表示方法IList等等,来为类之间建立关系。
XPO使用XPCollection来表示类之间的”对多关系”。并且附加属性来表示多对多还是一对多的关系。
"CustomerAddress" 关系名称。"Aggregated" 级联操作(删除、更新)。"Addresses" 集合属性名。注意两个类中关系名相同。public class Customer : XPObject{public string Name;[Association("CustomerAddress", typeof(Address)), Aggregated]public XPCollection Addresses{get { return GetCollection("Addresses"); }}}public class Address : XPObject{[Association("CustomerAddress")]public Customer Customer;}
public class Customer : XPObject{public string Name;[Association("CustomerType", typeof(Type)), Aggregated]public XPCollection Types{get { return GetCollection("Types"); }}}public class Type : XPObject{[Association("CustomerType", typeof(Customer))]public XPCollection Customers{get { return GetCollection("Customers"); }}}