c# - POCO 类未从 WCF 返回

标签 c# wcf entity-framework poco entity-framework-6

我有 3 个项目:

  1. 我使用 EF 6.1 的 DAL 类库
  2. WCF 服务库
  3. WPF 客户端应用

WPF 应用程序具有对 WCF 项目的服务引用。我遇到的问题是当我尝试这样的事情时:

public List<DbTable> GetItems()
{
    try
    {
        IQueryable<DbTable> items;
        using (var dbContext = new MyEntities())
        {                                        
            items = dbContext.Items.Select(a => a);
            return items.ToList();  
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
        return null;
    }
}

WCF 服务未返回任何结果,我收到通用 HTTP 未正确设置错误消息。

因此,在阅读了一些内容后,我决定在 WCF 服务中创建 POCO 类,这很有效。

using (var dbContext = new MyEntities())
{
   var items = dbContext.Items.Select(a =>
       new MyPocoClass
       {
           ItemId = a.ItemId,
           Name = a.Name
       });
   return items.ToList();
}

我的问题是,我是否可以不创建 POCO 类来来回传输数据而只返回 Entity Framework 对象?如果可以的话,我是不是漏掉了一步之类的?

这是我尝试返回任何 EF 对象时的消息

比如 return dbContext.Items.ToList();

我让它工作的唯一方法是使用 POCO 类。

enter image description here

更新:

这是我的服务配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MyProject.WebService.MyWebService">
        <endpoint address="" binding="basicHttpBinding" contract="MyProject.WebService.IMyWebService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/MyProject.WebService/MyWebService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

还有我的客户:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IMyWebService" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:8733/Design_Time_Addresses/MyProject.WebService/MyWebService/" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyWebService" contract="ServiceReference.IMyWebService" name="BasicHttpBinding_IMyWebService" />
    </client>
  </system.serviceModel>
</configuration>

重新更新-

Inner Exception:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)

最佳答案

我认为您应该保留 DTO 层 (POCO),因为随着您的模型变得越来越复杂,如果您尝试直接返回实体(取决于您的数据结构),延迟加载会导致各种问题。例如,如果您有一个相当标准的关系设置,例如:

  • 一个客户有多个联系人
  • 一个联系人有很多订单
  • 一个订单有多个订单项
  • 一个 Line Item 有很多 Store Inventory Level 记录
  • 一个订单项有很多照片
  • 等等

    public class Client
    {
      public int ClientId { get; set; }
      public string ClientName { get; set; }
      public IList<Contact> Contacts { get; set; }
    }
    
    public class Contacts
    {
      public int ContactId { get; set; }
      public string ContactName { get; set; }
      public IList<Order> Order { get; set; }
    }
    

当您尝试通过 WCF 边界传递客户端对象时,序列化程序将触及实体中的每个属性并加载相关实体(联系人、订单、订单项、商店库存、照片)。

这可能会导致大量级联的数据加载,或者由于循环引用而失败。

如果您禁用延迟加载,那么您的对象将充满空值,但还有很多其他原因不传递实体,例如如果您更改数据库结构等则不需要重建客户端应用程序。

如果您发现制作 DTO -> 实体 -> DTO 映射很耗时,请查看 AutoMapper,它可以做到这一点。

我发现使用 AutoFixture 和 DeepEqual 为这个映射编写单元测试很有帮助。

关于c# - POCO 类未从 WCF 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587074/

相关文章:

c# - Blowfish 无效长度异常

c# - 反序列化 JSON,其中属性名称指示值的类型

没有 IIS 的 c# rest webservice

C# 使用主键在数据库中保存值

c# - 如何从所属类之外检查事件处理程序的成员资格?

c# - 在调试中的 ASP.NET Core 启动时找不到 config.json

.net - jQuery 调用 WCF 服务

c# - WCF 上的 X.509 证书?

c# - 从 mysql 数据库中的 EdmGem.exe 生成实体类(ssdl、csdl、msl 等)时出错

c# - 如何在不引用 EF 的情况下识别 EF POCO 代理?