@Aiti
2020-04-25T03:29:40.000000Z
字数 3358
阅读 288
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"); }
}
}