C# 具有WCF的Linq到实体

C# 具有WCF的Linq到实体,c#,asp.net,linq,wcf,linq-to-entities,C#,Asp.net,Linq,Wcf,Linq To Entities,我的edmx文件中有一个单独的项目中的所有实体,我使用WCF服务将它们公开给我的客户机应用程序 这意味着我不必为我的客户端应用程序提供包含edmx文件的项目的直接链接。这将是不好的,因为它包含要查询数据库的对象 但只有我的WCF服务使用的实体才能从我的客户端应用程序访问。例如,因为我的服务中有以下代码: public MyClass GetMyClass() { return new MyClass(); } 。。我可以在客户端应用程序中使用access MyClass,例如: my

我的edmx文件中有一个单独的项目中的所有实体,我使用WCF服务将它们公开给我的客户机应用程序

这意味着我不必为我的客户端应用程序提供包含edmx文件的项目的直接链接。这将是不好的,因为它包含要查询数据库的对象

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

public MyClass GetMyClass()
{
     return new MyClass();
}
。。我可以在客户端应用程序中使用access MyClass,例如:

myServiceInstance.MyClass cls = new  myServiceInstance.MyClass()
如果我的edmx文件中有一个名为MyClass2的实体,我想在我的客户端应用程序中使用该实体,该怎么办!我如何实例化它,而不给我的客户机一个到我的edmx文件项目的直接链接,或者在我的服务层中创建一个返回MyClass2的usless方法

其他人在干什么


非常感谢

如果WCF服务不使用它,您想要它做什么?WCF服务(本身)纯粹用于数据传输——元数据的“mex”方法不共享代码,因此您的MyClass2将是无效的。如果您愿意,您可以在客户端使用程序集共享,但我真的不建议在这种情况下使用;客户端的EF对象乱七八糟。。。(另外,它在Silverlight、Client Profile、Compact Framework等轻量级框架上不起作用)


另一个选择是;这在WCF上有效,但是,与常规WCF方法相比,它为您提供了一个更为LINQ友好的API,并且您的模型公开的任何域对象都应该在客户端数据上下文中可用。

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

我们不得不这样做,因为不幸的是对象上下文(尚未)在WCF上可移植

考虑到您的情况:

  • 如果您的客户端应用程序是系统的外部应用程序,则它不应了解您的EDMX或其类的任何信息。它应该只知道您的WSDL和XSD
  • 如果您的客户端应用程序是内部的,那么尝试共享EF v1中的实体类是没有用的,因为它还没有得到正确的支持。您需要传输的不仅仅是类/对象——您还需要上下文,它可以维护更改跟踪,而且现在无法通过WCF直接完成
  • 如果您希望以“正确”的方式执行此操作,那么您应该为跨越连接的消息创建特殊类,而不是尝试将业务实体或数据对象作为消息重用。这样做的价值在于,您可以自由地更改业务实体和数据对象,而无需担心您向消费者公开的合同会发生变化。对您的服务的每一次更改都是经过深思熟虑的,因为它是独立于对数据和业务逻辑的更改而发生的


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

    如果您希望以不同的、更易于区分的格式显示代码段,请编辑您的问题,选择代码文本,然后单击大引号旁边带有01010的图标。