0投票否决 星 1
我希望能够共享我的datacontracts(在linq中生成的类到实体设计器使用[DataContract]属性进行修饰。
我正在尝试使用此处详述的架构:http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2并尝试使用“添加为链接”方法在我的silverlight项目中引用我的接口,如下所示:http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight
我遇到的问题是在我的silverlight项目中引用我的服务界面。
我的解决方案有以下项目:
ORM - 包含Linq to Entities edmx模型(namespace:company.client.Service) - 其中的类使用DataContract属性等进行修饰。
ServiceInterface - 包含interfaces(名称空间company.client.Service)和对返回的类(Customer等)的ORM的引用
服务 - 包含服务接口(名称空间company.client.Service)的实现,并引用ServiceInterface和类的ORM。
ServiceHost - 仅包含http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2
中建议的.svc文件WebSLHost - silverlight应用程序的主机
Gui - 银色GUI。
我希望所有项目都是标准的.net程序集,当然除了silverlight gui。
当我尝试添加指向我的服务接口文件的链接时(如http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight所示),它会发出编译错误,指出它找不到ORM并且无法识别我的实体类型。
我希望能够通过我的服务和silverlight客户端将linq生成的数据转换为实体生成器,所以如果有人有任何想法,我会很感激。
答案 0 :(得分:4)
您正在尝试的只能使用“完整”.NET到“完整”.NET(或至少匹配);即便如此,它打破了SOA的规则......
数据契约的整体思想是您共享数据的形状,而不是实现。这意味着Silverlight不了解EDMX或DataContract属性的一些更不寻常的风格(如回调)并不重要 - 数据仍然完好无损。
通过使用mex生成的类版本,您仍将拥有相同的基本数据行为 - 这是WCF与Silverlight的预期用例。所以只需使用服务参考。或者,您需要有一个位于EDMX和WCF之间的DTO类;只要DTO只使用WCF属性(但没有EDMX)就可以了,但显然这会带来巨大的维护成本。我个人怀疑在大多数简单的场景中它是值得的。
答案 1 :(得分:1)
我仍然认为你最好的办法是不要试图将你的linq-to-entities类从你的WCF组件传递给你的客户端。相反,创建只保存数据的简单DataContract类(仅限属性)。在WCF端填写,发送它然后在客户端使用数据重建一个可以与linq一起使用的正确对象。
有意义吗?
答案 2 :(得分:1)
不幸的是,LINQ to Entities类在其数据协定中公开了一些实现功能。他们真的会做得更好,根本不让这些课成为数据合同。
如前所述,只需创建自己的数据协定(DTO)类,它们与要返回的数据的形状相匹配。返回这些类的单个实例,或者它们的列表。
我建议不要使用DataSet,DataTable或其他任何特定于平台的内容。之所以这样,是因为它没有与Java等其他平台互操作。但是,我已经看到它在.NET中不能正常互操作的情况 - 在不同的.NET版本之间,我怀疑在完整的.NET和Silverlight之间。使用DTO,如上所述。
答案 3 :(得分:0)
从这里所说的内容以及我在其他地方所读到的内容来看,EDM数据交换似乎无法以我喜欢的方式与Silverlight共享。
但是,看起来它可以与silverlight共享linq到sql datacontracts。不完全是我想要的,但我可能会考虑。我刚刚开始使用WCF和silverlight,还没有决定哪个是我最好的选择。
答案 4 :(得分:0)
我正在尝试做同样的事情,只是发布在Silverlight.net论坛上。
如果没有办法,那么MS的可怕疏忽!实体是未来,未来Linq to SQL将不会有太多增强。想要使用Silverlight + WCF +实体框架真的不常见吗?您要么在每个服务代理命名空间中都使用单独的实体(这种平台无法在真正的Silverlight应用程序中运行),要么复制模式并在客户模式和实体模式之间进行转换,从而消除了美观和实体框架的简单性。
答案 5 :(得分:0)
我可以看到两种可能的解决方案。
通过使用预处理器指令包围非银光线来修改生成的linq-to-entities类
if!SILVERLIGHT
//非Silverlight代码
ENDIF
另一种方法是将.NET程序集转换为Silverlight兼容的程序集,如本文所述: Converting .NET Assemblies to Silverlight Assemblies