2011-05-04 62 views

回答

17

這是因爲您無法使用代碼優先方法定義數據庫視圖。數據庫視圖是在現有表/函數之上使用SQL查詢的數據庫結構。你不能先用代碼定義這樣的結構。

如果您想查看,您必須通過在自定義初始化程序中執行CREATE VIEW SQL腳本手動創建它 - 它將類似於this answer。請注意,如果您想將實體映射到視圖,這不會對您有所幫助。在這種情況下,您可能必須首先刪除由EF創建的表,然後使用相同的名稱創建視圖(我沒有嘗試過,但它可以實現)。另外請注意,並非每個視圖都是udpatable,因此您最有可能獲得只讀實體。

+0

是的,你是對的。事實上,我已經意識到,在代碼中定義視圖並沒有太多意義。 :) – 2011-05-05 08:33:34

+1

我使用EF構建數據庫時,在項目的初始化程序中實現了「刪除表並添加視圖」。沒有多少樂趣,但確實有效。如果那樣會使你遷移是一個懸而未決的問題。我正在尋找一種更清晰的方法來告訴EF Code First * not *生成特定表格。 – jlo 2012-06-07 18:15:38

+2

@Ladislav這就是爲什麼這個新的EF代碼優先的框架是唯一可行的,如果你的應用程序沒有複雜性,除了房屋數據以外沒有其他任何事情。如果應用程序實際上做了什麼 - 您將不得不堅持使用EDMX或您選擇的其他ORM系統。 – 2012-06-19 11:23:10

12

要做一個視圖你創建模型,然後在初始化器中運行SQL語句直接創建與第一行代碼的上下文視圖,然後在上下文中重寫OnModelCreating並運行第二行的代碼來忽略模型。

context.Database.ExecuteSqlCommand(Resources.<resourcename>); 

modelBuilder.Ignore<modeltype>(); 
+4

這個工作,我喜歡它,因爲它消除了需要刪除EF創建的表。但是應該指出的是,這種方法不能在EF模型中使用視圖。 – 2012-06-19 10:20:59

+3

@StephanKeller這是正確的,最終由於EF代碼優先方法的侷限性,我最終不得不回到老式的EDMX。說實話,如果你的應用程序做了什麼,你將無法使用EF代碼優先的方法。但最終不應該那麼令人驚訝,因爲自動化只能走得太遠。所以+1。 – 2012-06-19 11:20:55

相關問題