开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 6426|回复: 0

XPO简单教程

[复制链接]

0

精华

0

贡献

2

赞扬

帖子
13
软币
141
在线时间
8 小时
注册时间
2013-7-29
发表于 2013-7-30 19:02:16 | 显示全部楼层 |阅读模式
持久类

数据能够被存储到某个地方,下次需要的时候,可以通过类的某个功能从某个地方读取。
也就是实体类,是一个被数据库中的字段抽象出来的类,对这个类的操作会直接影响到数据库中的数据

源文档 <http://baike.baidu.com/view/1026832.html?fromTaglist>

什么是XPO
XPO是由大名鼎鼎的DevExpress提供的一种商业的ORM工具。
从概念上来说XPO是一种简单的对象映射技术,是一种把一个普通类变成持久化类的技术。也就是让一个普通的类和数据库中的一个表对应。把表中的字段和类中的字段对应,你可以透明的将一条记录直接保存到数据库,而不需要和ADO.net打交道。
下面是XPO中的类层次结构
这些类到底有啥作用呢?
这些类提供了将一个类的自身的数据保存到数据库中的所有功能。只要你继承其中一个类,你的类就马上变成了一个可以持久化的类了。也就是具有了将类自己的数据保存到数据库的能力。
看看顶层的XPBaseObject对象,他是XPO持久类中的基类,为其它的类提供了一个基本实现。当你的类继承XPBaseObject,你必须为你的类指定一个主键的字段。他不支持延后删除技术。
XPLiteObject 基本和基类没什么区别但是他不支持数据库并发中的锁定,和延后删除的技术。
XPCustomeObject和基类一样,但是他支持并发数据库中的锁定,同时他也和基类要提供自定义主键的。他是支持延后删除技术)
XPObject这个应该是最常用的,他提供自已的OID字段,因而如果你的类继承于它,就不需要为提供主键。(最全的类了,支持延后删除,支持锁定)
什么叫延后删除:一个持久化类,他是和数据库中的一个记录对应的,当你执行一个删除一个持久化类的动作的时候,XPO不会马上就去在数据库上执行真正的数据删除,而是将这条记录标记为删除,而且已经后不会在读取他。。当你要真正删除时,可以调用Session.PurgeDeletedObjects()来完全删除这些标记的记录

  
类名
  
  
延后删除
  
  
数据锁定
  
  
提供OID字段
  
  
XPBaseObject
  
  
不支持
  
  
支持
  
  
不提供
  
  
XPLiteObject
  
  
不支持
  
  
不支持
  
  
不提供
  
  
XPCustomObject
  
  
支持
  
  
支持
  
  
不提供
  
  
XPObject
  
  
支持
  
  
支持
  
  
提供
  


源文档 <http://blog.csdn.net/hwhone/article/details/6683832>


1.连接oracle
引用DevExpress.Xpo.v10.2.Providers
string connectionString= OracleConnectionProvider.GetConnectionString("TOPSITDB","topadmin", "topadmin");
IDataLayer dataLayer=XpoDefault.GetDataLayer(connectionString,AutoCreateOption.SchemaAlreadyExists);
//XpoDefault.GetDataLayer(connectionString,AutoCreateOption.DatabaseAndSchema);
XpoDefault.DataLayer =dataLayer;
XpoDefault.Session.ConnectionString= connectionString;

2.在原有数据库执行操作(How to prevent XPO from making any changes to a legacydatabase)
Yes, it's possible.It's enough to set the XpoDefault.Session.AutoCreateOptionproperty to None or to SchemaAlreadyExists to prevent XPO fromchanging the database schema.
设置AutoCreateOption.SchemaAlreadyExists(待测试)
源文档 <http://www.devexpress.com/Support/Center/kb/p/A2958.aspx>

3.XpoDataSource条件设置(XpoDataSource.Criteria Property)
The following code snippet demonstrates two equivalentcriteria applied to the XpoDataSource1 and XpoDataSource2 data sourcecontrols.
   
   
file:///C:\Users\jiaqi\AppData\Local\Temp\msohtmlclip1\01\clip_image001.gif
   
   
C#
   
  
  
  
XpoDataSource1.Criteria = "[Category] = 'Saloon' AND  [Price] < 100000";
    XpoDataSource2.Criteria = "[Category] = ? AND [Price] < ?";
    XpoDataSource2.CriteriaParameters.Add("Category", "Saloon");
    XpoDataSource2.CriteriaParameters.Add("Price", "100000");
  


The following criteria are identical because theyrefer to the same parameter values.
   
   
file:///C:\Users\jiaqi\AppData\Local\Temp\msohtmlclip1\01\clip_image001.gif
   
   
C#
   
  
  
  
XpoDataSource2.Criteria = "[Category] = ? AND [Price] <  ?";
    XpoDataSource2.Criteria = "[Category] = ?Category AND [Price] < ?Price";
  


源文档 <http://documentation.devexpress.com/#XPO/DevExpressXpoXpoDataSource_Criteriatopic>

4.存在三种对应关系
一对一:
public class Customer :XPObject
{
public Customer()
{
// Do not place any codehere.
}

public Customer(Sessionsession) : base(session)
{
// Do not place any codehere.
}

public Address Address;

public override voidAfterConstruction()
{
base.AfterConstruction();
// Initialize objectproperties here

Address = new Address();
}
...
}


public CntrLocation CntrLocation
{
    get { returnSession.GetObjectByKey<CntrLocation>(CntrId); }

}
http://www.devexpress.com/Support/Center/p/Q144683.aspx


一对多:
每个消费者有多条收货地址。
"CustomerAddress"关系名称。
"Aggregated"级联操作(删除、更新)。
"Addresses"集合属性名。

public class Customer :XPObject
{
public string Name;

[Association("CustomerAddress",typeof(Address)), Aggregated]
public XPCollectionAddresses
{
get { returnGetCollection("Addresses"); }
}
}

public class Address :XPObject
{
[Association("CustomerAddress")]
public CustomerCustomer;
}


例子:参考http://www.devexpress.com/Support/Center/e/E553.aspx

file:///C:\Users\jiaqi\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png
多对多:
每个消费者拥有多个类型,每个类型又包含消费者。
注意两个类中关系名相同。
public class Customer :XPObject
{
public string Name;

[Association("CustomerType",typeof(Type)), Aggregated]
public XPCollectionTypes
{
get { returnGetCollection("Types"); }
}
}

public class Type :XPObject
{
[Association("CustomerType",typeof(Customer))]
public XPCollectionCustomers
{
get { returnGetCollection("Customers"); }
}
}

源文档 <http://www.rainsts.net/article.asp?id=50>

5.每个持久类都需要一个指定为key的propery or field。XPObject和XPBaseObject的一个明显差别就是XPObject已有一个OId主键。
[Persistent("CreatedOn")] 强制映射字段
作用于aproperty or a field
XPO一般只对持久类中的可写property和publicfield进行持久化操作。因此对只读的field可以加上该特性进行强制持久化。
参数:表名(可选),可参考 http://www.devexpress.com/Support/Center/kb/p/A1383.aspx
源文档 <http://blog.csdn.net/cdznet/article/details/359222>

评分

参与人数 1赞扬 +1 收起 理由
elysianwu + 1 很给力

查看全部评分

回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-4-30 22:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表