2013-03-11 26 views
4

我是ASPNET和MVC 4的全新品牌,所以我想這可能是一個簡單的問題。但是,我一直無法正確谷歌答案。我只是想顯示一些銷售信息 - 我只需要需要顯示它。我不需要插入,更新或從基礎表中刪除。實體框架 - 從視圖創建模型?

有3個SQL Server表需要從中抽取數據:CurrentSales,SalesPlans和AverageSales。我爲此創建了一個VIEW並在其上放置了一個唯一的聚集索引;它包含一些外連接,但具有處理任何不太可能的NULL值的邏輯。

我去MODELS,添加一個新的ADO.NET實體數據模型,並添加我的視圖到模型。它回來並說 「表/視圖'vw_FullView'沒有定義主鍵 該鍵已被推斷,並且定義被創建爲只讀表/視圖。」 當我從這個模型和實體創建一個Controller類時,當我加載網站時,該視圖不顯示任何數據。但是,如果我創建一個完全空白的表格(具有適當的主鍵)作爲模型表格,然後使用存儲過程(作爲函數導入)來檢索我需要的數據,所有東西都可以完全工作精細。

這顯然不能正確處理這個問題。有沒有辦法從視圖中創建強類型模型?我更希望ASP.NET中的Controller和View對象能夠從模型中的SQL視圖中自動生成,而不是需要這張空白表來「欺騙」系統。

非常感謝提前。

+0

向我們展示這個動作和視圖(cshtml):「當我從這個模型和實體創建一個Controller類時,視圖顯示沒有數據,當我加載網站。」 – AaronLS 2013-03-11 21:12:38

+0

Aaron - 我仔細檢查了一下,看起來我實際上可以訪問我的MVC視圖中的SQL視圖模型對象,但它並不乾淨,也不會很好地格式化。我打算使用下面的解決方案之一併重新編碼。謝謝! – Skkra 2013-03-11 21:44:33

回答

3

實體框架不太喜歡視圖。它無法弄清楚視圖的主鍵是什麼,所以它假設任何不可爲空的字段都是複合主鍵的一部分。

通常,使用實體框架時避免視圖。創建一個linq查詢來完成你的視圖,然後使用它。

+0

問題在於,如果您需要從另一個數據庫提取數據,則視圖應該是必需的。 EF一次只查看一個數據庫,但通過查看,您可以獲取信息。 – sksallaj 2014-02-20 23:46:37

+0

@sksallaj - 不,不要爲此使用視圖。使用Sql服務器同義詞。您可以像創建普通表一樣爲它們創建Code First模型,並且它們的工作方式類似於表格..而不是視圖。 edmx文件很難,但仍然可以完成。 – 2014-02-20 23:53:48

+0

如何將同義詞添加到實體框架?我有同義詞,但沒有得到任何承認。事實上,我認爲這是一個從未實現的請求的EF功能。 – sksallaj 2014-02-21 00:05:01

1

視圖只是實體或實體組合的投影。默認情況下,實體框架只允許只讀訪問,因爲視圖中沒有真實實體,這意味着ET無法跟蹤更改。

simmdan實際上沒有很好地解釋瞭如何解決這個在MSDN forum

基本上,空軍終於文已經指出的那樣,如果你使用實體框架,最簡單的方法是用真正的克隆你的看法實體加入並由linq過濾。

+0

我明白了。由於各種業務限制,我試圖避免使用LINQ,並通過駐留在SQL中的存儲過程處理/映射所有內容。我想我必須想辦法解決這個問題,或者簡單地咬緊牙關並使用LINQ。 – Skkra 2013-03-11 21:34:39

+0

btw。你可以使用默認的sqlconnection並直接使用你的存儲過程讀取/更新你的視圖 – Ingo 2013-03-11 22:01:49

+0

@Skkra - 如果你不想使用linq,你爲什麼使用Entity Framework呢? – 2013-03-12 23:00:02

0

確實Entity Framework不喜歡SQL Server視圖,因爲主鍵在視圖中不明顯。不幸的是,在模型中指定[Key]似乎不夠。但是,它可以完成並且在98%的情況下非常有用,在這種情況下,有一個視圖組合了表格,而您只是想在網格中顯示它的數據。關鍵(赦免雙關語)是正確定義視圖。

我原來的觀點包含以下幾列:

DepartmentCode(varchar(8),not null) 
DepartmentName(varchar(60), not null) 
DivisionCode(varchar(8), null) 
DivisionName(varchar(8), null) 
StatusCode(char(1), not null) 
Virtual(varchar(1), not null) 

,並在我的模型我指定

[Key] 
[Column("DepartmentCode")] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[StringLength(8)] 
[Display(Name = "Department Code")] 
public string DepartmentCode { get; set; } 

當我架式這一點,並顯示在索引視圖,我被提及的主要錯誤鍵。顯然,實體框架假定所有非空字段都對主鍵起作用。

刪除額外的不是空值的伎倆。我強迫列在視圖中使用到可空如下:

CREATE view [dbo].[Departments] as 
select DepartmentCode 
,nullif(DepartmentName,'') as DepartmentName 
,nullif(DivisionCode,'') as DivisionCode 
,nullif(DivisionName,'') as DivisionName 
,nullif(StatusCode,'') as StatusCode 
,nullif(Virtual,'') as Virtual 
from .... 

現在視圖列看起來像這樣

DepartmentCode(varchar(8),not null) 
DepartmentName(varchar(60), null) 
DivisionCode(varchar(8), null) 
DivisionName(varchar(8), null) 
StatusCode(char(1), null) 
Virtual(varchar(1), null) 

有一次,我改變了看法,索引視圖工作正常。

我還確認,包含複合(多列)鍵的視圖也將工作,只要這些列不爲空,並且在您的模型中,您在每列指定了[Key],並且還添加Order = 1和Order = 2到這些鍵列上的[Column]註釋。

當然,這裏的假設是您有權修改視圖(或者可以創建替代視圖)。我只能確認這個作品在MVC 5和實體框架6上。