2011-10-13 160 views
1

說我有一個存儲過程GetAddressInfo(addressId int, errorCode int output)。存儲過程返回AddressLine1和State,如果addressId與數據庫中的某一行匹配。如果未找到行,則錯誤代碼設置爲非零值,並且不會觸發select語句。因此,它應該是這樣的:用EF 4.0調用存儲過程並使用輸出參數

if (valid address id) begin 
    Set errorCode = 1 
    return 
end 

select AddressLine1, State from .... 

當我使用EF 4.0調用這種存儲過程,我得到一個實體框架異常,當address id無效。例外情況提到AddressLine1列不是數據閱讀器的一部分。

我期待沒有結果(沒有記錄)並輸出錯誤代碼參數設置爲1.相反,我收到異常。我只是想停止處理剩下的存儲過程並立即返回。看起來像EF 4.0不太支持這個功能。

對此的任何想法?

在此先感謝!

+0

該地址ID驗證屬於您的應用程序... –

+0

理想情況下,是的,地址ID將在應用程序層進行驗證,但我正在處理的項目有大量類似邏輯的存儲過程。我試圖找到將它們移動到實體框架的簡單方法。 – Eric

回答

1

這是反對存儲過程的主要論據之一 - 業務邏輯開始最終落入其中。我不是說Im以任何一種方式投票 - 只要注意你遇到的問題是一個問題,並使單元測試更難一點。

EF通常需要知道正在返回的字段(取決於您如何映射)。你具體如何調用這個過程?直接在上下文中,或映射到實體操作(例如,選擇讀取操作)

如果將其映射到讀取操作,則需要更改如何執行此操作。您的列輸出列表應該一致。

+0

業務邏輯和它應該屬於哪裏始終是一個熱門話題。這是一個現有的項目,我試圖從使用第三方數據庫層轉換到EF 4.0。我們有相當多的這種邏輯存在的sps。我現在明白EF 4.0傾向於將所有內容映射到對象中,並期望列輸出一致。我們只需慢慢離開這個sps邏輯,不再使用'return'語句。我在某處讀到英國外交部現在在'迴歸'聲明中表現良好。 – Eric

1

爲什麼不在通過此SP調用SP之前檢查是否存在有效地址將始終返回有效的地址值,並且不會返回任何異常。

可能是它正在發生,因爲它總是從匹配的表,並在情況下,如果不把它拋出異常的記錄備案..

1

那麼,你的方法有點奇怪 - 至少對EF來說。

在某些情況下,你回報AddressLine1和國家(所以它的成立,預計這兩個),和在其他國家,你不...所以取決於輸入,該形狀你的輸出是不同的。 EF無法真正處理...

解決此問題的一個簡單方法是始終返回這兩列 - 如果addressId無效,那麼只需爲每列返回NULL

+0

逃脫我的部分是EF始終期待從存儲過程返回的東西。我期待它仍然能夠工作,因爲我沒有真正改變我的輸出(不添加或刪除列),而是沒有返回任何東西。換句話說,如果無法遍歷DataReader,請不要引發異常。 – Eric

相關問題