我正在使用Entity Framework 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)沒有動態代理。這基本上是我的代碼在做什麼。
我試過這個,但是我得到了無用的和非描述性的異常,顯示在下面。
任何人有任何意見?這是一個明智的事情嗎?如果不是,處理這種情況的最佳方法是什麼?
這是我從WCF測試客戶端了,當我試圖調用使用映射設置服務與MapperConfiguration(c => c.CreateMap<Patient, Patient>())
在接收到http://localhost:5448/PatientsService.svc HTTP響應時發生錯誤例外。這可能是由於服務端點綁定不使用HTTP協議。這也可能是由於HTTP請求上下文被服務器中止(可能是由於服務關閉)。查看服務器日誌獲取更多詳細信
服務器堆棧跟蹤:
在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引發WebException 引發WebException,HttpWebRequest的請求,HttpAbortReason abortReason)
在 System.ServiceModel.Channels.HttpChannelFactory`1。 HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超時)在 System.ServiceModel.Channels.RequestChannel.Request(消息消息, TimeSpan超時)在 System.ServiceM odel.Dispatcher.RequestChannelBinder.Request(消息 消息,TimeSpan超時) System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,ProxyOperationRuntime operation,Object [] ins, Object [] outs,TimeSpan timeout ) System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy。調用(即時聊天 消息)[0]時異常重新拋出:在 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即時聊天 reqMsg,即時聊天retMsg)System.Runtime.Remoting.Proxies.RealProxy。 PrivateInvoke(MessageData & MSGDATA,的Int32類型)在PatientsService.GetPatients()在 PatientsServiceClient.GetPatients()
內部異常:
底層連接已關閉:接收到 時發生意外錯誤。在System.Net.HttpWebRequest.GetResponse()在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(時間跨度 超時)
內部異常:
無法讀取來自傳輸連接的數據:現有的 連接被遠程主機強制關閉。 at System.Net.Sockets.NetworkStream.Read(Byte [] buffer,Int32 offset, Int32 size)at System.Net.PooledStream.Read(Byte [] buffer,Int32 offset,Int32 size)at System.Net .Connection.SyncRead(HttpWebRequest的請求,布爾 userRetrievedStream,布爾probeRead)
內部異常:
一個現有的連接由遠程主機在 System.Net.Sockets.Socket強制關閉。接收(字節[]緩衝區,Int32偏移量,Int32 siz E,的SocketFlags的SocketFlags)在 System.Net.Sockets.NetworkStream.Read(字節[]緩衝區,偏移的Int32, 的Int32大小)
問題_「爲什麼我們使用數據傳輸對象而不是我們的實體類跨越層」_已被討論爲死亡。你的研究顯示了什麼?你是否想要回答這個問題?還是你想解決這個問題? – CodeCaster
@CodeCaster其實,我沒有這樣想過。當EF創建它們時,我正在考慮將EF生成的類作爲POCO(如果您查看代碼,它們似乎是),並在頂部添加代理。我假設(也許不正確),當你自己創建它們時(如'var p = new Patient()'),那麼你得到沒有代理的POCO。從這個角度來看,創建相同的DTO似乎毫無意義。請你可以澄清這一點,因爲我不知道我錯在哪裏。 –
@CodeCaster有何評論?我應該如何做到這一點?任何人都可以評論? –