Linq到WCF的实体

时间:2008-10-21 06:42:24

标签: c# asp.net linq wcf linq-to-entities

我的所有实体都在我的edmx文件中的单独项目中,并使用WCF服务将它们暴露给我的客户端应用程序。

这意味着我不必为我的客户端应用程序提供指向包含edmx文件的项目的直接链接。这样做会很糟糕,因为它会将对象用于查询数据库。

但是只能从我的客户端应用程序访问我的WCF服务使用的实体。例如,因为我的服务中包含以下代码:

public MyClass GetMyClass()
{
     return new MyClass();
}

..我可以在我的客户端应用程序中使用访问MyClass,例如:

myServiceInstance.MyClass cls = new  myServiceInstance.MyClass()

如果我的edmx文件中有一个名为MyClass2的实体,我想在我的客户端应用程序中使用该怎么办!如何实现它而不给我的客户端直接链接到我的edmx文件项目或在我的服务层中创建一个返回MyClass2的无用方法

其他人在做什么?

非常感谢

3 个答案:

答案 0 :(得分:3)

我们使用域转移对象类创建了一个单独项目,这些类作为我们各种内部 WCF服务的数据合同。然后,我们与这些内部服务共享合同项目。我们有一个数据服务;这些方法会在存储/检索之前/之后将这些域对象转换为实体对象/从实体对象转换。同时,外部服务使用从XSD和WSDL文件生成的标准代理,并转换为共享域转移模型。

我们不得不这样做,因为很遗憾,对象上下文(还)可以通过WCF移植

针对您的情况的一些注意事项:

  1. 如果您的客户端应用外部到您的系统,它应该不了解您的EDMX或其类。它应该只知道您的WSDL和XSD。
  2. 如果您的客户端应用是内部,那么尝试在EF v1中共享实体类是没有用的,因为它尚未正确支持。您需要传输的不仅仅是类/对象 - 您还需要上下文,这样可以保持更改跟踪,而且现在无法直接通过WCF完成。

答案 1 :(得分:2)

如果WCF服务没有使用它,你想要什么? WCF服务(本身)纯粹用于数据传输 - 元数据的“mex”方法不共享代码,因此您的MyClass2将无能为力。如果需要,可以在客户端使用程序集共享,但我 在这种情况下不建议这样做;客户端的EF对象很乱......(加上它不适用于像Silverlight,Client Profile,Compact Framework等轻量级框架)

另一种选择是ADO.NET Data Services;这适用于WCF,但为您提供了比常规WCF方法更加LINQ友好的API - 并且您的模型公开的任何域对象都应该在客户端数据上下文中可用。

答案 2 :(得分:1)

如果您想以“正确”的方式执行此操作,则应该为跨越线路的消息创建特殊类,而不是尝试将业务实体或数据对象重用为消息。这样做的价值在于,您可以随意更改业务实体和数据对象,而无需担心您向消费者更改的合同。对服务的每次更改都会更加谨慎,因为它独立于数据和业务逻辑的变化而发生。

另一种处理方法就是使用svcutil(或“添加服务引用...”,尽管svcutil更适合多个服务端点)来生成客户端将使用的所有类,而不是添加对服务器项目。这样,您的客户将看到的唯一类是服务公开的类。