数据模型中的继承 WCF RIA Services允许我们使用做为继承体系中的一部分的实体。一个继承模型包含了一个从其他数据类派生的数据类。例如,一个多态继承模型可以包含一个Customer实体和两个从Customer派生的实体(PublicSectorCustomer和PrivateSectorCustomer)。通过RI
数据模型中的继承
WCF RIA Services允许我们使用做为继承体系中的一部分的实体。一个继承模型包含了一个从其他数据类派生的数据类。例如,一个多态继承模型可以包含一个Customer实体和两个从Customer派生的实体(PublicSectorCustomer和PrivateSectorCustomer)。通过RIA Services,我们可以在domain Services中写一个返回一个根类型的集合和从根类型派生的类型的查询方法。或者,可以写一个仅返回派生类型集合的查询方法。还可以写修改根类型或任何派生类的操作方法。
注:只在VS2010和SL4中使用RIA Services时支持继承,在VS2008和SL3中不支持。

数据模型
在服务端项目中,我们可以像定义其他数据类那样来为继承模型定义数据类。使用的这个对象模型既可以是从数据层中自动生成的类也可以是手动创建的数据类。
我们不必非要通过domain service来公开整个层次。相反,在domain service中公开的层次中最后派生的类,是与客户端交互的根类。从根类型派生出的类型可以向客户端公开,但父类型不必被公开。在根类中,必须把想要公开的的任意派生类型包含在KnownTypeAttribute属性中。如果想要忽略派生类型,可以不把它包含在KnownTypeAttribute属性中。下面示例了一个包含基类Customer,和两个派生类PrivateSectorCustomer,PublicSectorCustomer的手工创建的数据模型。两个派生类会包含在Customer类的KnownTypeAttribute属性下,因为Customer是数据操作的根类型。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[KnownType(typeof(PublicSectorCustomer)), KnownType(typeof(PrivateSectorCustomer))]
public class Customer
{
    [Key]
    public int CustomerID { getset; }
    public string FirstName { getset; }
    public string LastName { getset; }
    public string Address { getset; }
    public string City { getset; }
    public string StateProvince { getset; }
    public string PostalCode { getset; }
    [Association("CustomerOrders""CustomerID""CustomerID")]
    public List<ORDER> Orders { getset; }
}
public class PublicSectorCustomer : Customer
{
    public string GSARegion { getset; }
}
public class PrivateSectorCustomer : Customer
{
    public string CompanyName { getset; }
}

多态查询
定义了数据模型后,我们创建一个对客户端公开类型的domain service。当在一个查询方法中公开一个类型时,可以返回这个类型和任意派生的类型。例如,一个返回Customer实体集合的查询可以包含一个PrivateSectorCustomer对象和PublicSectorCustomer对象。还可以指定一个只返回一个派生类型的查询方法。下面示例了返回不同类型的查询方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public IQueryable<CUSTOMER> GetCustomers()
{
    return context.Customers;
}
public IQueryable<CUSTOMER> GetCustomersByState(string state)
{
    return context.Customers.Where(c => c.StateProvince == state);
}
public IQueryable<PUBLICSECTORCUSTOMER> GetCustomersByGSARegion(string region)
{
    return context.Customers.OfType<PUBLICSECTORCUSTOMER>().Where(c => c.GSARegion == region);
}
public IQueryable<PRIVATESECTORCUSTOMER> GetPrivateSectorByPostalCode(string postalcode)
{
    return context.Customers.OfType<PRIVATESECTORCUSTOMER>().Where(c => c.PostalCode == postalcode);
}

为客户端项目生成代码
当生成解决方案时,在客户端会为已经在domain service中公开的继承体系生成代码。体系的根类被生成并派生于Entity类。每个派生的类都是生成和派生于根类。在DomainContext类中,只生成一个Entity(TEntity)成员属性,并且它需要根类型的对象。为每一个查询都生成了EntityQuery对象,它返回在domain service操作中指定的类型。
下面示例了一个在客户端为查询方法生成的简单版本的代码。它并没有包含所有生成类中的代码,只是想强调一些重要的成员属性和方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/ExampleApplication.Web")]
[KnownType(typeof(PrivateSectorCustomer))]
[KnownType(typeof(PublicSectorCustomer))]
public partial class Customer : Entity
{  
    public string Address { getset; }
    public string City { getset; }
    [Key()]
    public int CustomerID { getset; }
    public string FirstName { getset; }
    public string LastName { getset; }
    public string PostalCode { getset; }
    public string StateProvince { getset; }
    public override object GetIdentity();
}
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/ExampleApplication.Web")]
public sealed partial class PrivateSectorCustomer : Customer
{
    public string CompanyName { getset; }
}
[DataContract(Namespace="http://schemas.datacontract.org/2004/07/ExampleApplication.Web")]
public sealed partial class PublicSectorCustomer : Customer
{
    public string GSARegion { getset; }
}
public sealed partial class CustomerDomainContext : DomainContext
{
    public CustomerDomainContext();
    public CustomerDomainContext(Uri serviceUri);
    public CustomerDomainContext(DomainClient domainClient);
    public EntitySet<CUSTOMER> Customers { get; }
    public EntityQuery<CUSTOMER> GetCustomersQuery();
    public EntityQuery<PUBLICSECTORCUSTOMER> GetCustomersByGSARegionQuery(string region);
    public EntityQuery<CUSTOMER> GetCustomersByStateQuery(string state);
    public EntityQuery<PRIVATESECTORCUSTOMER> GetPrivateSectorByPostalCodeQuery(stringpostalcode);
}

数据修改
可以为继承体系中的更新、插入和删除对象添加domain service方法。如同查询方法,可以为操作指定一个根类型或一个派生类型。然而,任何对派生类的更新、插入或删除操作也都应该可以在根类型中执行。可以在体系中为任何类型添加named updat
方法。会为在方法中指定的类型在客户端生成相应的named update方法。
下面的代码示例了两个更新方法和一个named update方法的签名。

?
1
2
3
4
5
public void UpdateCustomer(Customer customer) { /* implement */ }
public void UpdatePublicSectorCustomer(PublicSectorCustomer customer) { /* implement */ }
public void EnrollInRewardsProgram(PrivateSectorCustomer customer) { /* implement */ }

关联
可以在根类或派生类中定义关联。我们在练歌数据类之间应用AssociationAttribute属性来定义一个关联。在数据模型的例子中,在Customer和Order之间定义了一个关联。如果对根类型应用了关联,那么所有的派生类型也包含这个关联。
使用继承的基本规则

  • 仅对实体类型支持继承,非实体类型被当做在domain service操作签名中指定的类型。
  • 在domain service操作中的返回值和参数,不支持接口类型。
  • 在代码生成的时候必须知道继承体系中的类型集。在生成代码的时候没有指定返回类型的行为是未指明和实现相关的。
  • 允许对实体类型的公共成员属性或字段使用virtual或new。但在客户端对应生成的实体类型中会被忽略。
  • 不允许对domain service操作方法重载。
  • 与继承相关的LINQ查询功能不能用来运行domain service方法。特别地,不支持OfType>T&lt;,is,as和GetType()操作符和方法。然而,在LINQ to Objects查询中的EntitySet或EntityCollection(TEntity)上直接使用这些操作符。

实体继承体系

定义继承体系使用下面的规则:

  • 使用System.Runtime.Serialization.KnownTypeAttribute属性来指定已知的类型。对RIA Services来说,需要使用包含一个System.Type参数并具有KnownTypeAttribute的构造函数。
  • 体系中的已知类型,必须在domain service公开的体系中的根类型中指定。RIA Services 不支持在派生类型上声明类型为已知。
  • 每个在已知类型集中的类都必须是public。
  • 在体系中的一个或多个类可以是abstract的。
  • 当声明已知类型时,可以在体系中省略一个或多个类。
  • 必须在根类中指定关键成员。
  • 关联的声明和使用是不可改变的。

DomainService操作

在继承体系中使用下面规则定义domain service 操作

  • 在体系中至少有一个对应于根类型的查询方法。其他的查询操作可以使用派生类型作为返回值。
  • 对返回多态结果的方法,查询方法可以返回一个根类型。
  • 如果对系统内的类型定义了更新、插入、或删除操作,那么对根类型也要定义相同的操作。不可能只对某些类型选择操作。
  • 自定义操作可以使用根类型或派生类型作为实体参数。当实例的实际类型是从自定义操作中的类型派生的时候,操作是可行的。
  • DomainServiceDescription类返回对给定类型最适用的更新、插入、删除和查询方法。

TpyeDescriptionProvider

下面的规则应用于TypeDescriptionProvider(TDP)

  • 当体系中的根类型通过一个查询方法或IncludeAttribute属性公开时,会对LINQ to SQL应用TpyeDescriptionProvider,并且实体框架会自动对实体使用KnownType属性声明。而对派生类型则不会如此。
  • 在Add New Domain Service Class对话框中不会提供任何继承体系的功能。用户可以在体系中选择一些、全部或不选择类型。

生成的代码

对体系中的实体,以下的规则应用于客户端的生成代码

  • 对每个继承体系,只生成一个EntitySet(TEntity)类。在已知的体系中EntitySet(TEntity)的类型参数是最基本的类型。
  • 对体系中每个已知的类型,都对应生成一个实体类型。即使没有domain service方法公开这个类型,这个实体类型也会生成。
  • 对指定的类型可生成自定义方法,并这些方法可用于任何派生类型。
  • 构造函数是根据继承体系来绑定的。每个类型都可以调用OnCreated方法并可以自定义此方法。
  • 如果服务端的实体体系中的类被跳过,那么在客户端生成的实体体系中也会被跳过。

转载于:https://www.cnblogs.com/Areas/archive/2011/09/09/2172177.html

Silverlight WCF RIA服务(十七)数据 7相关推荐

  1. Silverlight WCF RIA服务(十三)数据 3

    如何验证数据 我们对实体和成员属性添加验证属性来实施验证规则.WCF RIA Service提供了几个验证属性来执行常用的验证检测,还提供了CustomValidationAttribute属性来执行 ...

  2. Silverlight WCF RIA服务(二十三)Silverlight 客户端 4

    DomainDataSource WCF RIA Services提供DomainDataSource控件来简化用户界面和域上下文中数据的交互.通过DomainDataSource,我们可以只是用声明 ...

  3. Silverlight WCF RIA服务(三十四)身份验证、角色、个性化 5

    如何:创建自定义验证属性 WCF RIA Services框架提供了RequiresAuthenticationAttribute和RequiresRoleAttribute属性.这两个属性使我们很方 ...

  4. Silverlight WCF RIA服务(二十七)Silverlight 客户端 8

    演练:在Silverlight商业应用程序中显示数据 在本演示中,我们将创建一个显示数据的Silverlight商业应用程序.Visual Studio提供了几个设计时工具来帮助我们创建SL商业应用程 ...

  5. WCF RIA 服务 (三十二)-- 身份验证、角色、个性化 3

    如何:在RIA Services中允许角色功能 使用角色,我们可以指定哪个验证用户组可以访问某些资源. WCF RIA Services中的角色功能是建立在ASP.NET的角色功能上的. 我们只有在用 ...

  6. WCF RIA优缺点

    优点:WCF RIA提供方便的数据访问形式, 服务端代码写在.cs文件中 继承DomainService,类前要声明[EnableClientAccess()] 生成后sliverlight项目中/G ...

  7. (转)使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型

    原文地址:http://www.cnblogs.com/luminji/archive/2011/06/10/2077696.html 本文目的是通过Silverlight ria service完成 ...

  8. Silverlight+WCF 实战-网络象棋最终篇之对战视频-下篇[客户端发送与服务端中转](六)...

    本篇继上一篇:Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)  一:对战视频 简单原理 略,内容见上篇. 二:对战视频 步骤解析: 略 ...

  9. linux c调用wcf服务,Silverlight+WCF实现跨域调用

    在这篇文章中,WCF扮演服务器,向外提供LoginVaild服务:Silverlight扮演客户端,调用WCF提供的LoginVaild服务.思路有了,下面进行代码实现. 数据库脚本实现 新建T_Us ...

  10. Silverlight 应用 WCF RIA Services 在 IIS6 部署问题总结

    WCF RIA Services 部署在IIS6很简单,但是也会出现一些问题 我们的应用是Silverlight 4 Business Application,应用了WCF RIA Service,  ...

最新文章

  1. 揭秘华为AI一站式开发平台,3步构建一个AI模型 | 华为昇腾师资培训沙龙西安场...
  2. 面试题之判断栈的入栈和出栈序列的合法性
  3. Linux目录结构和常用命令
  4. dos通过for命令截取字符串
  5. 【企业管理】2020年3-4 月 每日花语
  6. (引)ajax 经验-保留自己使用
  7. linux中tar命令的使用
  8. 关于C++异常处理的一些思考
  9. 轻松搞定面试中的链表题目
  10. pv原语模拟实现_并发编程信号量的使用方法和其实现原理
  11. mysql 绑定 cpu 节点_MySQL Cluster(MySQL集群)配置
  12. javafx实现读者文摘上的文章预览及下载
  13. java的hashmap排序_Java HashMap两种简便排序方法解析
  14. walking机器人仿真教程-激光导航-仿真多点导航
  15. latex段落悬挂缩进_使用正则表达式在Java中悬挂缩进段落
  16. 2020年最新计算机二级考试题库资料大全!
  17. 机器学习中的数据级联:被低估的数据,被高估的模型
  18. 关于Java面试,你应该准备这些知识点
  19. J1939-21数据链路层多帧协议PDU解析
  20. 浅谈slf4j,logger中的{}功能

热门文章

  1. 解決win7打开EXE文件总是出现安全警告
  2. php 一个URL加密解密的程序
  3. 用OCR技术识别验证码---tesseract
  4. postman使用记录,带cookie的get请求和传json对象的post请求示范
  5. CentOS 如何修改mysql 用户root的密码
  6. 悲剧!因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效...
  7. 20个使用 Java CompletableFuture的示例,不服不行
  8. 面试百度、阿里、腾讯,这134道Java面试题你会多少?
  9. 运维专家写给运维工程师的 6 条人生忠告
  10. 定了!这 35 所高校将设人工智能本科专业!