Xpo學習一

XPO 使用記錄

XPO 使用記錄

1. 一般實體類直接繼承自 XPObject,如果需要自定義主鍵或自增字段則可繼承自XPCustomObject。

2. 繼承自XPBaseObject的實體類,Delete後將被直接物理刪除。而XPCustomObject & XPObject的繼承類則是軟刪除。
(1) 實體對象軟刪除
customer.Delete();
customer.Save();

(2) 物理刪除
Session.DefaultSession.PurgeObject(customer);

(3) 物理刪除所有被標記軟刪除的記錄。
Session.DefaultSession.PurgeDeletedObjects();

(4) 清除數據庫中所有數據。
Session.DefaultSession.ClearDatabase();

(5) 恢復被軟刪除的記錄。
while(true)
{
o = (MyObject)Session.DefaultSession.FindObject(typeof(MyObject), new NotOperator(new NullOperator("GCRecord")), true);
if (o == null)
{
break;
}
o.GCRecord = null;
o.Save();
}

(6) 批量刪除

XPCollection customers = new XPCollection(typeof(Product), new BinaryOperator("Customer", "Tom"));
Session.DefaultSession.Delete(customers);
Session.DefaultSession.Save(customers); // persist deletion 我的1.58版本Session.Save()沒有重載這個方法????

3. 繼承自XPCustomeObject的類必須使用KeyAttribute指定主鍵,且只能指定一個字段(??????)。
public class Customer : XPCustomObject
{
[Key]
public string Name;
}

4. 指定字段的類型和大小。
public class Customer : XPObject
{
[Size(20)]
public string Name;

[DbType("nvarchar(6)"]
public string Postcode;

[DbType("Text")]
public string Summary;
}

5. 字段驗證。缺省情況下我們使用 public field 來公開字段,改用 public property 就可以實現字段賦值驗證。
public class Customer : XPObject
{
private string postcode;
public string Postcode
{
get { return postcode; }
set
{
// ... 驗證代碼省略...
postcode = value;
}
}
}

6. 只讀字段。缺省情況下XPO只爲可寫的公開字段或屬性創建字段,我們可以通過PersistentAttribute屬性來創建只讀字段。NonPersistentAttribute作用則相反,表示該字段或屬性不寫入數據庫。
public class Customer : XPObject
{
[Persistent]
public DateTime Date
{
get { return DateTime.Now; }
}

[Persistent("Date")]
private DateTime date;
}

7. 一對多。下面的演示代碼,每個消費者有多條收貨地址。

"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;
}

8. 一一對應時,不會自動創建其對應對象。

public class Customer : XPObject
{
public Customer()
{
// Do not place any code here.
}

public Customer(Session session) : base(session)
{
// Do not place any code here.
}

public Address Address;

public override void AfterConstruction()
{
base.AfterConstruction();
// Initialize object properties here

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

9. 多對多。每個消費者擁有多個類型,每個類型又包含消費者。
注意兩個類中關係名相同。
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"); }
}
}

10. 延遲字段。DelayedAttribute屬性讓字段只有在被操作的時候才載入數據,比較適合操作大數據字段。
public class Goods: XPObject
{
public string Name;
public decimal Price;
public string CatalogId;
...
private XPDelayedProperty image1 = new XPDelayedProperty();

[Delayed("image1")]
public Byte[] Image1
{
get { return (Byte[])image1.Value; }
set { image1.Value = value; }
}
}

11. 分頁。注意XPO的XPCursor的作用是分頁緩存,而並非我們一般情況下說的分頁。和XPCollection不同,XPCursor每次只將指定數目(PageSize)的實體對象載入內存,當我們枚舉操作(IEnumerable)的對象超出當前緩存,則自動讀取下一頁繼續操作,這種方法比XPCollection要節省內存。正因爲如此,XPCursor只提供了foreach單向循環操作,而不能使用索引器的方式獲取實體對象。至於我們平常所用的分頁方法,可以使用XPPageSelector基於XPCollection實現。

12. 連接 SQL Server
Session.DefaultSession.Connection = new System.Data.SqlClient.SqlConnection("server=(local);uid=sa;pwd=;database=test");
Session.DefaultSession.AutoCreateOption = AutoCreateOption.SchemaOnly;

13. NullValueAttribute 屬性只是當字段等於某個特定值時,寫入數據庫時將值替換爲DBNull。而獲取時,如果值爲DBNull,則使用該指示值替代。
public class Customer : XPObject
{
public string Name;

[NullValue("unknown email!")]
public string Email;
}

14. IndexedAttribute 索引字段
public class Customer : XPObject
{
[Indexed(Unique = true)] // 無重複索引. "[Indexed]" 有重複索引。
public string Name;
}

15. XPObject.Reload()只刷新當前對象的屬性,不刷新其關聯子對象的屬性。

16. 監視XPO自動生成SQL。在app.config 中增加下面的配置。1.58我測試無效。?????

[XML]

< ?xml version="1.0" encoding="utf-8" ?>
< configuration>
< system.diagnostics>
< trace indentsize="4">
< listeners>
< add name="LogFileTraceListener" type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.log" />
< remove name="Default" />
< /listeners>
< /trace>
< switches>
< add name="XPO" value="3" />
< /switches>
< /system.diagnostics>
< /configuration>

17. ExplicitLoadingAttribute可以指定多層引用的遞歸層數,以減少數據庫查詢,提高性能。

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層。

18. 多ASP.net Application中使用XPO,DevExpress推薦方案是爲每個Request創建一個Session,也就是說:
Stateless + Session for each Request + Connection Pool

發佈了112 篇原創文章 · 獲贊 5 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章