【问题标题】:How can I share Linq to Entities datacontracts between WCF and Silverlight如何在 WCF 和 Silverlight 之间共享 Linq to Entities 数据合同
【发布时间】:2009-02-20 14:52:26
【问题描述】:

0 票否决 星星 1

我希望能够共享我的数据合同(在 linq to entity 设计器中生成的类用 [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 模型(命名空间:company.client.Service) - 其中的类用 DataContract 属性等装饰。

ServiceInterface - 包含接口(命名空间 company.client.Service)和对返回的类(客户等)的 ORM 的引用

Service - 包含服务接口(命名空间 company.client.Service)的实现,并引用 ServiceInterface 和类的 ORM。

ServiceHost - 仅包含 http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2 中推荐的 .svc 文件

WebSLHost - silverlight 应用程序的主机

Gui - Silverlight GUI。

我希望所有项目都是标准的 .net 程序集,当然除了 silverlight gui。

当我尝试添加指向我的服务接口文件的链接(如 http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight 所示)时,它会给出一个编译错误,指出它找不到 ORM 并且无法识别我的实体类型。

我希望能够与我的服务和 silverlight 客户端共享 linq to entity 生成器生成的数据合同,所以如果有人有任何想法,我将不胜感激。

【问题讨论】:

    标签: .net linq wcf silverlight web-services


    【解决方案1】:

    您正在尝试的内容仅适用于“完整”.NET 到“完整”.NET(或至少匹配);即便如此,它还是违反了 SOA 的规则……

    数据契约的整体理念是您共享数据的形状,而不是实现。这意味着 Silverlight 不了解 EDMX 或一些更不寻常的 DataContract 属性(如回调)并不重要 - 数据仍然完好无损。

    通过使用 mex 生成的类版本,您仍将拥有相同的基本数据行为 - 这是使用 Silverlight 的 WCF 的预期用例。所以只需使用服务参考。或者,您需要有一个位于 EDMX 和 WCF 之间的 DTO 类;只要 DTO 只使用 WCF 属性(但没有 EDMX)就应该没问题,但显然这会带来巨大的维护成本。我个人怀疑在最简单的情况下是否值得。

    【讨论】:

    • 好的,所以如果我在后台使用 Linq to Entities 并且类用 [DataContract] 和 [DataMember] 装饰(用于 WCF 序列化),是否无法引用这些在我的 Silverlight 客户端中?我想如果我的服务可以返回这些类型,我就可以在 SL 中引用?
    • 数据合同位很好;问题是 EF 基类,它在 Silverlight 中根本不存在。您需要原始数据合同或 mex 生成的合同。
    【解决方案2】:

    我仍然认为您最好的选择是不要尝试将您的 linq-to-entities 类从您的 WCF 组件传递给您的客户端。相反,创建仅保存数据(仅属性)的简单 DataContract 类。在 WCF 端填写它,将其发送过去,然后在您的客户端中使用数据来重构可以与 linq 一起使用的适当对象。

    有意义吗?

    【讨论】:

    • 我明白你在说什么,但简单的数据合同将包含与 EDM 数据合同完全相同的字段,因为所有数据都是可更新的。创建相同的数据合同似乎是多余的,并且必须在它们和 EDM 字段之间进行映射。没有其他人试图这样做或类似的事情吗?
    • 我在传递数据集时没有问题,但我还没有尝试过你正在尝试的方法。如果你明白了,请在这里分享! :)
    【解决方案3】:

    不幸的是,LINQ to Entities 类在其数据协定中公开了一些实现功能。如果根本不让类成为数据契约,他们真的会做得更好。

    如前所述,只需创建与要返回的数据形状相匹配的您自己的数据协定 (DTO) 类。返回这些类的单个实例,或它们的列表。

    我建议不要使用 DataSet、DataTable 或其他任何特定于平台的东西。以前这样做的原因是它不能与其他平台(如 Java)互操作。但是,我已经看到它在 .NET 中无法正常互操作的情况 - 在不同的 .NET 版本之间,我怀疑在完整的 .NET 和 Silverlight 之间。如上所述,使用 DTO。

    【讨论】:

      【解决方案4】:

      从这里所说的和我在其他地方读到的内容看来,EDM 数据合同似乎无法以我想要的方式与 Silverlight 共享。

      但是,看起来确实可以使用 silverlight 共享 linq to sql 数据合同。不完全是我想要的,但我可能会考虑的东西。我刚刚开始使用 WCF 和 silverlight,还没有决定哪个是我的最佳选择。

      【讨论】:

        【解决方案5】:

        我正在尝试做同样的事情,只是在 Silverlight.net 论坛上发布。

        如果没有办法,那么 MS 的疏忽太可怕了!实体是未来,未来不会对 Linq to SQL 做太多的增强。想要使用 Silverlight + WCF + Entity Framework 真的那么罕见吗?您要么被每个服务代理命名空间中的单独实体困住(这在真正的 Silverlight 应用程序中不起作用),要么复制模式并在您的客户模式和实体模式之间进行转换,这会失去美感和实体框架的简单性。

        【讨论】:

          【解决方案6】:

          我可以看到两种可能的解决方案。

          1. 通过用预处理器指令包围非silverlight行来修改生成的linq-to-entities类

            如果 !SILVERLIGHT

            //非silverlight代码

            结束

          2. 另一种方法是将 .NET 程序集转换为与 Silverlight 兼容的程序集,如本文所述: Converting .NET Assemblies to Silverlight Assemblies

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-23
            • 1970-01-01
            相关资源
            最近更新 更多