Xpo (XPBaseObject、XPLiteObject、XPCustomObject、XPObject)
类名 |
延后删除 |
是否乐观锁定 |
提供OID字段 |
不支持 |
支持 |
不提供 |
|
不支持 |
不支持 |
不提供 |
|
支持 |
支持 |
不提供 |
|
支持 |
支持 |
提供
|
普通类:就是一个简单的定义的类。
持久化类:可以把类的实例中的数据透时的保存到数据库中的类。
XPO是一种简单的对象映射技术,是一种把一个普通类变成持久化类的技术。也就是让一个普通的类和数据库中的一个表对应。把表中的字段和类中的字段对应,你可以透明的将一条记录直接保存到数据库,而不需要和ADO.net打交道。
XPBaseObject对象,他是XPO持久类中的基类,为其它的类提供了一个基本实现。当你的类继承XPBaseObject,你必须为你的类指定一个主键的字段。他不支持延后删除技术。
XPObject 这个应该是最常用的,他提供自已的OID字段,因而如果你的类继承于它,就不需要为提供主键。(最全的类了,支持延后删除,支持锁定)
XPLiteObject 基本和基类没什么区别 但是他不支持数据库并发中的锁定,和延后删除的技术。
XPCustomeObject 和基类一样,但是他支持并发数据库中的锁定,同时他也和基类要提供自定义主键的。他是支持延后删除技术)
什么叫延后删除:一个持久化类,他是和数据库中的一个记录对应的,当你执行一个删除一个持久化类的动作的时候,XPO不会马上就去在数据库 上执行真正的数据删除,而是将这条记录标记为删除,而且已经后不会在读取他。。当你要真正删除时,可以调用Session.PurgeDeletedObjects()来 完全删除这些标记的记录
A、XPBaseObject
1.建立实体类C继承XPBaseObject
public class C : XPBaseObject
{
public C()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
[Persistent("id"),Key]
public string id;
[Persistent("name")]
public string name;
}
在数据生成的字段如下:id,name,optimisticLockField;optimisticLockField 是乐观锁,值为true 或flase,
他的作用是防止其他用户试图同时更新对象,如果A在更新数据,B也在更新数据。
将执行保存的程序添加前添加:
DevExpress.Xpo.Session.DefaultSession.LockingOption =LockingOption.Optimistic;
将执行后添加:
DevExpress.Xpo.Session.DefaultSession.LockingOption=LockingOption.None;
然后看下延迟删除:
if (this.ddlMain.SelectedIndex == -1)
{
return;
}
XPCollection<C> collection = new XPCollection<C>(new BinaryOperator("id", this.ddlMain.SelectedItem.Value, BinaryOperatorType.Equal));
C s = collection[0];
s.Delete();
}
ddlMain是下拉列表
运行 删除,数据库直接没有了这条数据。那么延后删除时什么意思呢?我们到支持延迟删除的类来看吧。
遇到错误:
1、Key Property for 'C' type is absent
解决:必须在继承的持久类中设置一个主键字段[persister("id"),key],如果你数据中对应的表没有设置,执行程序之后XPO会自动将你定义的字段设置成主键。
B、XPLiteObject
1、建立实体类C继承XPLiteObject
由于它各种不支持所以
在数据库的字段还是id,name
但是在官方文档中说可以手动启用乐观锁,不解啊..给字段设置为报错,给类设置怎么设呢?求解(更正:是在类上设置attribute 即:
[OptimisticLocking(true)]
public class C : XPLiteObject)
从元数据:
using DevExpress.Xpo.Metadata; namespace DevExpress.Xpo
{
//
// 摘要:
// Implements the DevExpress.Xpo.IXPObject.
[MemberDesignTimeVisibility(false)]
[NonPersistent]
[OptimisticLocking(false)]
public abstract class XPLiteObject : XPBaseObject
{
protected XPLiteObject();
protected XPLiteObject(Session session);
protected XPLiteObject(Session session, XPClassInfo classInfo);
}
}
C、XPCustomObject
仅仅不提供了OID
从元数据:
namespace DevExpress.Xpo
{
//
// 摘要:
// Implements the DevExpress.Xpo.IXPObject and provides a custom key definition.
[DeferredDeletion]
[MemberDesignTimeVisibility(false)]
[NonPersistent]
public abstract class XPCustomObject : XPBaseObject
{
protected XPCustomObject();
protected XPCustomObject(Session session);
protected XPCustomObject(Session session, XPClassInfo classInfo);
}
}
D、XPObject
全部支持
1、提供OID字段
它为持久类对应的那张表设置增加OID字段, 且这个OID字段为标识列, 其实就当于为我们创建了一个自增主键ID
2、延迟删除
延迟删除为在数据库增加字段GCRecord, 当我们删除在程序中删除一个字段的时候,其实它仅仅是在数据库的GCRecord字段记录一串数字,并标识它是已删除的
如果我们要真的删除,必须用:
DevExpress.Xpo.Session.DefaultSession.PurgeDeletedObjects();
清除已标记为删除对象的数据