使用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,如需转载请自行联系原作者

相关文章
|
C# 前端开发
silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳。本章节的动画虽然简单,但是实现的效果可是一点也不打折。
1177 0
|
C#
silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之会飞的小鸟篇(Blend 4开发) 本教程基本涵盖了WPF和silverlight中的各种动画。先上张效果图。 声明下,这个做的不是让大家照搬的,只是让大家熟悉下动画效果,这个成品基本涵盖了sl里面所有的动画效果。
1385 0
|
C#
silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之迟来的第三章 动画整合篇(Blend 4开发) 有个问题想请教下大家,我仿了腾讯的SL版QQ,相似度95%以上。我想写成教程教大家怎么开发出来,会不会有版权什么问题的。
1120 0
|
前端开发 C#
silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发) 这章有点长,所以我分成了两章。这一章主要是准备工作,差不多算美工篇吧,这章基本不会介绍多少动画效果,主要讲的是blend中工具的使用,利用哪些工具做出哪些效果。
1224 0
|
前端开发 C#
silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来。 1.新建一个usercontrol,命名为menu. 2.按照下图设置一下属性。
1236 0
|
数据库 测试技术 安全
使用Entity Framework和WCF Ria Services开发SilverLight之2:POCO
在上一篇中《使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型》我们提出这类简单模型的几个问题: 1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。
1230 0
|
测试技术 Go 数据库
使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型
本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。 Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。
962 0
|
C# Windows
怎样使用.NET RIA Services 创建 Silverlight Business Application(一)
HRApp 项目是.NET RIA Services MSDN  上的案例,一个使用Silverlight 3.0 + .Net RIA Service 构建的完整商业应用程序, 学习英文版的开发手册总是比较费力的,所以顺带着简略翻译一下,也有部分自己心得体会,不足之处还望大家多多交流。
1060 0