将一个对象映射到同一类型的另一个对象是否有意义

本文关键字:一个对象 有意义 类型 是否 映射 | 更新日期: 2023-09-27 17:56:54

我正在使用实体框架 6 并将查询结果从 WCF 服务发送出去。如果我尝试发送查询返回的实体,则由于动态代理而出现异常。

我之前的解决方法是使用这样的代码...

return PatientServiceLogic.GetAll()
  .Select(p => new Patient {
    ID = p.ID,
    FirstName = p.FirstName,
    Surname = p.Surname,
    AccidentDate = p.AccidentDate
  })
  .ToList();

这是一个简化的示例。可以想象,当对象图增长时,这可能会相当痛苦。

我刚刚发现了AutoMapper,看起来它会为我节省很多样板代码。当我想发送一个 Patient 对象的集合,这些对象将在客户端应用程序的网格中使用时,我不想要完整的 Patient 对象图,我想要一个简化的扁平化版本。为此,PatientDto课程就可以了。

但是,假设我确实想发送完整的对象图。我认为创建 Patient 类和所有相关类的抄送副本,然后将一个复制到另一个,只是为了能够将它们发送出去没有任何意义。重用 EF 生成的类并将 Patient 对象映射到新的 Patient 对象会更有意义,该对象(在代码中创建,而不是 EF)没有动态代理。这基本上就是我上面的代码正在做的事情。

我试过这个,但我得到了下面显示的无用和非描述性异常。

有人有什么意见吗?这甚至是明智之举吗?如果没有,处理这种情况的最佳方法是什么?

下面是当我尝试使用与 MapperConfiguration(c => c.CreateMap<Patient, Patient>()) 设置的映射调用服务时,我从 WCF 测试客户端获得的异常

接收对 http://localhost:5448/PatientsService.svc 的 HTTP 响应时出错。这可能是由于服务终结点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关更多详细信息,请参阅服务器日志。

服务器堆栈跟踪:

在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
在 System.ServiceModel.Channels.HttpChannelFactory'1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时)在 System.ServiceModel.Channels.RequestChannel.Request(Message message, 时间跨度超时)在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message 消息,时间跨度超时)在 System.ServiceModel.Channels.ServiceChannel.Call(String action, 布尔单向, ProxyOperationRuntime operation, Object[] ins, 对象[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,代理操作运行时操作) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

在 [0] 处重新引发异常:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at PatientsService.GetPatients() at PatientsServiceClient.GetPatients()

内部异常:

基础连接已关闭:上发生意外错误 a 接收。 at System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Channels.HttpChannelFactory'1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时)

内部异常:

无法从传输连接读取数据:现有的 远程主机强行关闭了连接。 在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.Net.PooledStream.Read(Byte[] buffer, Int32 偏移量,Int32 大小)在 System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)

内部异常:

远程主机在 System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 大小, 套接字标志套接字标志) 在 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 大小)

将一个对象映射到同一类型的另一个对象是否有意义

您当前的问题似乎是您的数据库连接在您完成数据处理之前已关闭。

尝试使用

db.mainEntity.Include(i=>i.relatedtable).Include(i=>i.anotherRelatedtable)

在查询所有相关实体中。

不在序列化程序中创建对象的一对一副本的一个很好的理由是循环(您可能之前在使用 json 馈送组件时已经解决了它们):

父亲有孩子,孩子有父亲,谁

有孩子,谁有...溢出!