WCF RIA 服務 (十五)- 數據 5

 

層的組成
WCF RIA Services允許我們爲具有層次概念的數據類創建應用邏輯,例如SalesOrderHeader實體和SalesOrderDetail實體。這樣 相關實體就組成了所謂的層次。定義了類之間的組成關係後,就可以像操作一個單一個體一樣來操作對實體的數據修改,而不是像操作獨立實體那樣。這就會簡化中 間層的邏輯,因爲我們可以對整個實體層來寫應用邏輯,而不是把邏輯拆分對應每個實體並在數據操作時企圖協調這些拆分的邏輯。
瞭解 層的概念
在實體的層級概念中,一個實體被稱爲父實體,其他關聯的實體被稱爲子實體。父實體是表示數據的類,是那些子實體數據的 的根。例如,SalesOrderHeader實體是父實體,SalesOrderDetail是子實體。SalesOrderHeader實體內的一個 記錄可以和SalesOrderDetail實體內的多個記錄連接起來。
作爲層次關係一部分的數據類通常具有如下特徵:


  • 這 些實體間的關係可以表示爲一個有子實體和一個父實體的樹型結構。子實體可以擴展爲任何數量的級別。
  • 子實體的生命週期是包含在父實體的生 命週期內。
  • 子實體如果離開了父實體的上下文,就沒有了有意義的身份。
  • 需要把實體看做單一個體來對實體進行數據操作。 例如,添加、刪除、或更新子實體內的一個記錄,需要在父實體內也有相應的改動。

定義一個組成關係

要 在實體間定義層次關係,可以對在實體間表示關聯的成員屬性應用CompositionAttribut屬性。下面的示例展示瞭如何通過元數據類來在 SalesOrderHeader和SalesOrderDetail之間定義層次關係。CompositionAttribute屬性在 System.Web.Ria.Data命名空間內。需要用using來引用這個命名空間。

當 對成員屬性應用CompositionAttribute屬性時,子實體內的數據不能從父實體自動尋回。爲了在查詢結果中包含子實體,應該對錶示子實體的 成員屬性應用IncludeAttribute屬性,並在查詢方法中包括子實體。可以參考最後的例子。

Domain Service操作組合的層次關係

當定義了組合層次後,需要改變父實體和子實體交互的方式。包含在Domain Service中的邏輯必須解釋實體間的聯繫。通常,通過對父實體的Domain Service方法來定義層次的邏輯。在對父實體的Domain Service操作裏,處理對父實體和子實體的更改。

下面的規則應用於Domain Service操作來操作有層次關係的實體。

  • 允 許對父和子實體使用查詢方法,但推薦在父實體的上下文內查詢子實體。如果修改沒有通過父實體裝載的子實體會拋出一個異常
  • 可以添加對子實 體的數據修改操作,但這些操作可以被父實體內的操作影響。

    • 如果允許對父實體更改,那麼更改、插入、和刪除操作被允許在子 實體上。

    • 如果父實體有一個命名的更新named updated方法,那麼所有子實體都必須允許更新操作。

    • 如 果在父實體允許插入、刪除,那麼在子實體也應該允許對應的操縱。

在客戶端,對有 層次關係的實體應用下面的規則。

  • 當子實體包含一個改動,這個改動要通知給父實體。父實體上的HasChanges應設置爲 true。
  • 當一個父實體被改動,所有的子實體(包括沒有改動的子實體)都被包括在改動集合中。
  • 在客戶端的子實體中不 會在Domain上下文中生成public的EntitySet,必須通過父實體來訪問子實體。
  • 一個子實體可以在相同的級別上有多個始 祖,但必須確認它只能在一個始祖的上下文中裝載。

數據更改的操作按以下的規則運行。

  • 在遞歸執行任何子 實體上的數據修改操作之前,更新、插入、或刪除首先在父實體上執行。
  • 如果需要的數據操作沒有出現在子實體中,那遞歸執行會停止。
  • 當 更新一個父實體時,沒有指定子實體數據操作的執行順序。

下面的示例展示了SalesOrderHeader實體的查詢、更改、 刪除方法。這些方法包含了在子實體內的處理改變的邏輯。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章