2012-03-12 25 views
1

我已經開始將舊的ADO.NET代碼移植到Linq to Entities。一個特別有用的功能是ObjectContext.Translate及其伴侶ObjectContext.ExecuteStoreQuery,它允許您使用任意SQL並將它們解開爲簡單的舊數據對象。ObjectContext.Translate:避免列映射錯誤

但是,在列映射中出現錯誤很容易:拼寫錯誤的列名或不同的案例導致.NET屬性不再與預期的SQL列匹配。這對於檢測DB架構何時更改尤其棘手。當.NET屬性不對應sql列時,不會拋出異常 - 相反,Linq僅適用於sets the property to the default valuenull0等)的實體。此行爲可能偶爾有用,允許類型包含額外的屬性,但它也非常擅長隱藏錯誤,特別是當null或默認值是該列的有效值時。

有什麼方法可以改變這種行爲,或者至少檢測它的發生時間,以便這樣的錯誤立即顯而易見?

換句話說:我可以強制執行.NET對象的形狀必須完全匹配SQL查詢的形狀嗎?

回答

1

不,你不能執行它,但你可以編寫一套集成測試,它會自動驗證你的類仍然具有正確的形狀。

+0

沒錯,但這是相當不方便的,因爲它需要手動複製實體框架提供的將列映射到屬性的所有漂亮邏輯;或者更糟糕的是,實際上是爲每個查詢單獨編寫一個測試,主要是爲了驗證沒有這樣一個微不足道的錯誤。 – 2012-03-13 15:43:56

+0

是的,您必須手動編寫這些測試,因爲您正在使用手動編寫的查詢 - 這不是EF可以爲您處理的事情。集成測試正是人們用來驗證手寫查詢的方式。如果你不喜歡它,開始使用LINQ-to-entities來避免這些錯誤。 – 2012-03-13 16:47:07

+0

這不是必需的:我在代碼中添加了驗證步驟。它只是檢查DataReader中的所有列是否與給定類型的屬性相對應,反之亦然。然後,這只是列出相關查詢(在我的情況下,再次可能用反射)並且只進行一次簡單測試就可以了。它比讓EF爲你做這種驗證要複雜得多,但仍比維護我的數據結構的又一個樣板表示要簡單得多。 – 2012-03-19 19:08:40