您的位置:首页 > 其它

WCF RIA 服务 (十五)- 数据 5

2010-06-05 01:27 232 查看
层的组成
WCF RIA Services允许我们为具有层次概念的数据类创建应用逻辑,例如SalesOrderHeader实体和SalesOrderDetail实体。这样相关实体就组成了所谓的层次。定义了类之间的组成关系后,就可以像操作一个单一个体一样来操作对实体的数据修改,而不是像操作独立实体那样。这就会简化中间层的逻辑,因为我们可以对整个实体层来写应用逻辑,而不是把逻辑拆分对应每个实体并在数据操作时企图协调这些拆分的逻辑。

了解层的概念
在实体的层级概念中,一个实体被称为父实体,其他关联的实体被称为子实体。父实体是表示数据的类,是那些子实体数据的的根。例如,SalesOrderHeader实体是父实体,SalesOrderDetail是子实体。SalesOrderHeader实体内的一个记录可以和SalesOrderDetail实体内的多个记录连接起来。
作为层次关系一部分的数据类通常具有如下特征:

这些实体间的关系可以表示为一个有子实体和一个父实体的树型结构。子实体可以扩展为任何数量的级别。
子实体的生命周期是包含在父实体的生命周期内。
子实体如果离开了父实体的上下文,就没有了有意义的身份。
需要把实体看做单一个体来对实体进行数据操作。例如,添加、删除、或更新子实体内的一个记录,需要在父实体内也有相应的改动。

定义一个组成关系

要在实体间定义层次关系,可以对在实体间表示关联的成员属性应用CompositionAttribut属性。下面的示例展示了如何通过元数据类来在 SalesOrderHeader和SalesOrderDetail之间定义层次关系。CompositionAttribute属性在 System.Web.Ria.Data命名空间内。需要用using来引用这个命名空间。

代码

1 [EnableClientAccess()]
2 public class OrderDomainService : LinqToEntitiesDomainService<adventureworkslt_dataentities>
3 {
4 public IQueryable<salesorderheader> GetSalesOrders()
5 {
6 return this.ObjectContext.SalesOrderHeaders.Include("SalesOrderDetails");
7 }
8 public void UpdateSalesOrder(SalesOrderHeader currentSalesOrderHeader)
9 {
10 SalesOrderHeader originalOrder = this.ChangeSet.GetOriginal(currentSalesOrderHeader);
11 if ((currentSalesOrderHeader.EntityState == EntityState.Detached))
12 {
13 if (originalOrder != null)
14 {
15 this.ObjectContext.AttachAsModified(currentSalesOrderHeader, this.ChangeSet.GetOriginal(currentSalesOrderHeader));
16 }
17 else
18 {
19 this.ObjectContext.Attach(currentSalesOrderHeader);
20 }
21 }
22 foreach (SalesOrderDetail detail in this.ChangeSet.GetAssociatedChanges(currentSalesOrderHeader, o => o.SalesOrderDetails))
23 {
24 ChangeOperation op = this.ChangeSet.GetChangeOperation(detail);
25 switch (op)
26 {
27 case ChangeOperation.Insert:
28 if ((detail.EntityState != EntityState.Added))
29 {
30 if ((detail.EntityState != EntityState.Detached))
31 {
32 this.ObjectContext.ObjectStateManager.ChangeObjectState(detail, EntityState.Added);
33 }
34 else
35 {
36 this.ObjectContext.AddToSalesOrderDetails(detail);
37 }
38 }
39 break;
40 case ChangeOperation.Update:
41 this.ObjectContext.AttachAsModified(detail, this.ChangeSet.GetOriginal(detail));
42 break;
43 case ChangeOperation.Delete:
44 if (detail.EntityState == EntityState.Detached)
45 {
46 this.ObjectContext.Attach(detail);
47 }
48 this.ObjectContext.DeleteObject(detail);
49 break;
50 case ChangeOperation.None:
51 break;
52 default:
53 break;
54 }
55 }
56 }
57 public void DeleteSalesOrder(SalesOrderHeader salesOrderHeader)
58 {
59 if ((salesOrderHeader.EntityState == EntityState.Detached))
60 {
61 this.ObjectContext.Attach(salesOrderHeader);
62 }
63 switch (salesOrderHeader.Status)
64 {
65 case 1: // in process
66 this.ObjectContext.DeleteObject(salesOrderHeader);
67 break;
68 case 2: // approved
69 case 3: // backordered
70 case 4: // rejected
71 salesOrderHeader.Status = 6;
72 break;
73 case 5: // shipped
74 throw new ValidationException("The order has been shipped and cannot be deleted.");
75 default:
76 break;
77 }
78 }
79 }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackant2/archive/2010/04/08/5461621.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: