簡體   English   中英

實體框架 - 從視圖創建模型?

[英]Entity Framework - Create a model from a view?

我是ASPNET和MVC 4的新手,所以我想這可能是一個簡單的問題。 但是,我一直無法正確谷歌答案。 我只想顯示一些銷售信息 - 我需要顯示它。 我不需要從基礎表插入,更新或刪除。

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

我轉到MODELS,添加一個新的ADO.NET實體數據模型,並將我的視圖添加到模型中。 它返回並說“表/視圖'vw_FullView'沒有定義主鍵。已經推斷出密鑰,並且定義被創建為只讀表/視圖。” 當我從此模型和實體創建Controller類時,視圖在加載網站時不顯示任何數據。

但是,如果我創建一個完全空白的表 - 使用適當的主鍵 - 充當模型表, 然后使用存儲過程(作為函數導入)來檢索我需要的數據,一切正常。

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

提前謝謝了。

實體框架非常不喜歡視圖。 它無法確定視圖的主鍵是什么,因此它假定任何非可空字段都是復合主鍵的一部分。

通常,在使用Entity Framework時避免使用視圖。 創建一個linq查詢,它可以執行您的視圖所做的操作並使用它。

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

simmdan實際上做了很好的工作,解釋了如何在MSDN論壇中解決這個問題

基本上,正如Mystere Man已經指出的,如果你使用實體框架,最簡單的方法是使用由linq連接和過濾的真實實體來克隆你的視圖。

確實,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; }

當我搭建這個並顯示索引視圖時,我在引用主鍵時出錯。 顯然,Entity Framework假定所有非空字段都對主鍵有貢獻。

刪除額外的非空值就可以了。 我使用以下方法強制視圖中的列可以為空:

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和Entity Framework 6。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM