xpo-4大类

 

                                      Xpo (XPBaseObject、XPLiteObject、XPCustomObject、XPObject)

类名

延后删除

是否乐观锁定

提供OID字段

XPBaseObject

不支持

支持

不提供

XPLiteObject

不支持

不支持

不提供

XPCustomObject

支持

支持

不提供

XPObject

支持

支持

提供

 

               

       普通类:就是一个简单的定义的类。

     持久化类:可以把类的实例中的数据透时的保存到数据库中的类

        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();

清除已标记为删除对象的数据

 

 





posted @ 2016-08-11 10:33  笑笑未来  阅读(720)  评论(0编辑  收藏  举报