使用Entity Framework和WCF Ria Services开发SilverLight之7:多个Domain Service间共享Poco实体

简介:

在前两篇中,我们讲了在SL端通过Entity Framework和WCF Ria Services实现联表查询,其中最关键的是为实体类中的相关属性设定为Include特性,如下:

image

遗憾的是,这样的实体Include只能在单个域服务间共享实体。如果你尝试撰写多个域服务,并用到关联实体,会报如下错误:

The entity type 'MiniNWModel.Entities.Product'  is  exposed by  multiple DomainService types.
Entity types cannot be shared across DomainServices.    SilverlightApplicationSample

有人指出,域服务上下文应该是long life的,所以整个应用程序应该只有一个域服务。不过,这难道不是有点扯吗?应用程序所支撑的数据库动辄上百张表,不同的业务范畴建立多个域服务基本是必须的。

一:数据库支撑

本篇所采用的数据库来自于《Entity Framework 4.1 and Poco 使用存储过程联表查询》。

二:数据实体

本篇共涉及两个实体,要让两个实体在多个域服务间共享彼此,必须依赖特性ExternalReference。以下是主表实体:

image

以下是从表实体:

image

一定要注意正确匹配Association,否则关联数据的时候会不正确。

三:域服务

两个域服务类没有任何特殊之处。唯一需要注意的是,在调试的时候我们会发现EF联表查询中得到的数据,如果不做特殊处理,从表数据全部会丢失。如下图源码:

image

在方法GetCategoryWithProductsWithID中,我们会得到从表的数据,这是EF为我们得到的,但是千万不要以为数据会被Ria Service带到SL客户端。

四:SL获取主从表数据

如果SL的某个功能需要同时得到主从表数据,我们必须同时提供包含这两个实体的域服务,在下图代码中,我们首先创建好这两个域服务(图中1)。然后,首先我们必须获取主表数据(图中2),其次是从表数据(图中3),最后,SL客户端要指定两者的关联(图中4):

image

获取主从表的全部代码如下:

public  class  PrinSubVm : NotificationObject
     {
         public  DomainServiceCategory DomainServiceCategory { get ; set ; }
         public  DomainServiceProduct DomainServiceProduct { get ; set ; }
 
         private  IList<Category> categoryWithProducts;
         public  IList<Category> CategoryWithProducts
         {
             get  { return  categoryWithProducts; }
             set  { categoryWithProducts = value; this .RaisePropertyChanged<IList<Category>>(() => this .CategoryWithProducts); }
         }
 
         public  PrinSubVm()
         {
             DomainServiceCategory = new  Web.DomainServiceCategory();
             DomainServiceProduct = new  Web.DomainServiceProduct();
 
             //获取CategoryID(cid)为1的目录
             DomainServiceCategory.Load<Category>(DomainServiceCategory.GetCategoryWithProductsWithIDQuery(1), new  Action<System.ServiceModel.DomainServices.Client.LoadOperation<Category>>( this .GetCategoryWithProductsWithIDCallBack), null );
 
             //获取CategoryID(cid)为1的目录下的商品
             DomainServiceProduct.Load<Product>(DomainServiceProduct.GetProductsByCategoryIDQuery(1), new  Action<System.ServiceModel.DomainServices.Client.LoadOperation<Product>>( this .GetProductsByCategoryIDCallBack), null );
 
             //为多个域之间共享实体
             DomainServiceCategory.AddReference( typeof (Product), DomainServiceProduct);
 
         }
 
         void  GetCategoryWithProductsWithIDCallBack(LoadOperation<Category> arg)
         {
             CategoryWithProducts = arg.Entities as  IList<Category>;
 
         }
 
         void  GetProductsByCategoryIDCallBack(LoadOperation<Product> arg)
         {
             //ProductAndCategorys = arg.Entities as IList<Product>;
         }
     }

有一点我们必须注意,如果要获取从表的数据,仅获取需要的从表记录就可以了,不要加载全部记录,想想那些动辄几百万记录的业务表。SL客户端会自动根据实体的KEY值去关联。

反过来,我们也可以实现从表关联主表。在这里就不一一举例了。但是最后的UI可以作为演示。

image

image

image


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/07/05/2098210.html,如需转载请自行联系原作者

相关文章
|
测试技术 Go 数据库
使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型
本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。 Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。
1023 0
|
数据库 测试技术 安全
使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO
在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型》我们提出这类简单模型的几个问题: 1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。
1295 0
|
数据库
使用Entity Framework和WCF Ria Services开发SilverLight之4:Map之主外键映射
上一篇粗粗讲了一下如何使用EF4.1,针对POCO进行MAP,此篇在此基础上进行一下深入,具体讲一下如何进行映射。   1:主外键中的1对多映射 还是针对School数据库。查看如下两个表: 可以知道,两者的关系是: 也就是说,Department对于Course来说,是1对多的关系。
808 0
|
数据库 存储
使用Entity Framework和WCF Ria Services开发SilverLight之7:多个Domain Service间共享Poco实体
在前两篇中,我们讲了在SL端通过Entity Framework和WCF Ria Services实现联表查询,其中最关键的是为实体类中的相关属性设定为Include特性,如下: 遗憾的是,这样的实体Include只能在单个域服务间共享实体。
821 0
|
C# Windows
怎样使用.NET RIA Services 创建 Silverlight Business Application(一)
HRApp 项目是.NET RIA Services MSDN  上的案例,一个使用Silverlight 3.0 + .Net RIA Service 构建的完整商业应用程序, 学习英文版的开发手册总是比较费力的,所以顺带着简略翻译一下,也有部分自己心得体会,不足之处还望大家多多交流。
1123 0
|
.NET C# 开发框架
Probems for Hosted ADO.NET Data Services & Silverlight
I’ll be the first to admit I’m a novice in world of web development, so I expected a learning curve and my fair share of hurdles as I started a new project in Silverlight and ASP.
839 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一