2011-12-30 128 views
1

是否可以在實體框架中創建實體視圖而不在DAL中創建視圖?創建實體視圖

我有一個父表,名爲收據收據可以是活動的或不活動的。如果我實施IsActive作爲收據的屬性,那麼忘記將.Where(r=>r.IsActive)附加到所有Linq查詢並將其添加到以前的代碼中的成本很高。我試圖繼承兒童DeletedReceipt條件IsActive = false在模型和添加條件IsActive = true收據(父)。幸福的生意沒有任何改變。問題是我不能寫停用方法,而收據有很多重要的關係。我知道它不是面向對象的。我認爲我可以處理它的觀點。但我不改變我的DAL商業方法! 的情況是「IsActive」起到辨別器的作用,並且不能在中更新取消激活方法。一種方式可能是使用SP,但這意味着「DAL請處理我該死的業務邏輯」。 有什麼想法?

+0

我上次檢查** **沒有**。 – 2011-12-30 09:25:06

+0

你能否提供更多細節? – 2011-12-30 09:25:27

+0

[QueryView] [1]有助於以某種方式創建實體視圖,但不支持導航道具。 [1]:http://msdn.microsoft.com/en-us/library/cc716798.aspx – 2011-12-30 12:33:35

回答

2

有兩種方法來創建視圖:

  • DefiningQuery - 在EDMX文件的SSDL部分自定義SQL選擇。您可以使用任何SQL來定義新的只讀實體。問題是,一旦你使用它,你不能再使用從數據庫更新,因爲它會覆蓋你在EDMX中的改變(除非你爲EF設計者購買了一些更強大的擴展)。
  • QueryView - 自定義ESQL在EDMX文件的MSL部分中選擇,它必須從現有實體中選擇。它支持關係,但只支持其他查詢視圖。

在這兩種情況下創建的實體是一個視圖=只讀。除非將更新,插入和刪除操作映射到存儲過程或自定義SQL(再次寫入EDMX文件),否則不能將其用於保存更改。

無論如何,你正在嘗試做的事情會導致很多問題。你有沒有需要在你的應用程序中訪問DeletedReceipt?如果是的話,你需要完整的邏輯,因爲你有ActiveReceipt?如果沒有不這樣做。

問題是IsActive軟刪除的條件是EF處理得不好。您可以在不需要使用Where(r => r.IsActive)的主要查詢中解決問題,但您是否曾使用預先加載或延遲加載來加載其他實體的相關收據?如果是,你希望只加載有效的收據?這是真正的問題。無論是急切還是懶惰加載都支持過濾,因此您將始終加載活動記錄和已刪除記錄。處理這種情況的唯一方法是(無需手動執行所有操作)conditional mapping但條件映射允許您在應用程序中僅包含這些實體中的一個,並且您需要自定義存儲過程以進行軟刪除。

「DAL請處理我該死的業務邏輯」

作爲一個側面說明這個報價,如果你不想DAL處理任何邏輯不要指望它給你纔有效收據自動。這也是DAL中的邏輯。所以如果你真的認爲在所有查詢中使用Where(r => r.IsActive)就是你要找的。如果你想從DAL獲得一些幫助,它必須包含一些邏輯,有時候這些邏輯將在SQL中。

+0

謝謝拉迪斯拉夫您的完整答案。所以你的意思是我應該糾正我的想法! – 2011-12-30 14:54:34