2016-07-14 24 views
0

我正在使用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大小)

+0

問題_「爲什麼我們使用數據傳輸對象而不是我們的實體類跨越層」_已被討論爲死亡。你的研究顯示了什麼?你是否想要回答這個問題?還是你想解決這個問題? – CodeCaster

+0

@CodeCaster其實,我沒有這樣想過。當EF創建它們時,我正在考慮將EF生成的類作爲POCO(如果您查看代碼,它們似乎是),並在頂部添加代理。我假設(也許不正確),當你自己創建它們時(如'var p = new Patient()'),那麼你得到沒有代理的POCO。從這個角度來看,創建相同的DTO似乎毫無意義。請你可以澄清這一點,因爲我不知道我錯在哪裏。 –

+0

@CodeCaster有何評論?我應該如何做到這一點?任何人都可以評論? –

回答

1

您當前的問題似乎是你的數據庫連接被關閉,你finisheds工作之前與你的數據。

嘗試使用

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

在查詢所有相關實體。

一個很好的理由不要讓你的對象的序列化1對1複製的循環(你可能已經使用JSON-feeded組件時之前解決它們):

父親有孩子,和孩子有父親,有孩子,有......溢出!

+0

感謝您的回覆,但它有什麼用?所有相關的實體已經加載,所以我不確定使用.Include()將要添加的內容。我的根本問題(這不是我在這個問題中解決的問題)是關聯的實體在連接關閉之前不會被加載。爲了避免這種情況,我需要能夠告訴查詢哪些關聯實體**不包括**。請你澄清。 –

+0

如果啓用加載啓用。實體只會在引用時加載相關元素。我還沒有嘗試過,但是,如果您的對象在內存中,我不確定EF會在嘗試訪問它們之前分配子元素。使用「包含」應該強制在進行查詢時更新這些關係。當然,**必須在連接關閉前詢問結果**,因此在退出上下文的使用語句或範圍之前,請在結果集上嘗試使用ToList() –

相關問題