实体框架 - 从视图创建模型?

时间:2013-03-11 21:05:31

标签: c# entity-framework asp.net-mvc-4

我是ASPNET和MVC 4的新手,所以我想这可能是一个简单的问题。但是,我一直无法正确谷歌答案。我只想显示一些销售信息 - 我只需要显示它。我不需要从基础表中插入,更新或删除。

需要从中提取3个SQL Server表:CurrentSales,SalesPlans和AverageSales。我为此创建了一个VIEW并在其上放置了一个唯一的聚簇索引;它包含一些外连接,但具有处理任何不太可能的NULL值的逻辑。

我转到MODELS,添加一个新的ADO.NET实体数据模型,并将我的视图添加到模型中。它回来说     “表/视图'vw_FullView'没有定义主键。     已推断密钥,并将定义创建为只读表/视图。“ 当我从此模型和实体创建Controller类时,视图在加载网站时不显示任何数据。

但是,如果我创建一个完全空白的表 - 使用适当的主键 - 作为模型表,然后使用存储过程(作为函数导入)来检索我需要的数据一切都很好。

这显然不是处理此问题的正确方法。有没有办法从视图中创建强类型模型?我更喜欢让ASP.NET中的Controller和View对象从模型中的SQL视图中自动生成,而不是需要这个空白表来“欺骗”系统。

非常感谢提前。

3 个答案:

答案 0 :(得分:4)

实体框架非常不喜欢观点。它无法确定视图的主键是什么,因此它假定任何非可空字段都是复合主键的一部分。

通常,在使用Entity Framework时请避免使用视图。创建一个linq查询,它可以执行您的视图所做的操作并使用它。

答案 1 :(得分:1)

视图只是实体或实体组合的投影。默认实体框架只允许只读访问,因为视图中没有真实实体,这意味着ET无法跟踪更改。

simmdan实际上做了很好的工作,解释了如何在MSDN forum

中解决这个问题

基本上,正如Mystere Man已经指出的那样,如果你使用Entity Framework,最简单的方法是使用由linq加入和过滤的真实实体克隆你的视图。

答案 2 :(得分:0)

实体框架确实不喜欢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和对这些键列上的[Column]注释的Order = 2。

当然,这里的假设是您有权修改视图(或者可以创建备用视图)。我只能确认这适用于MVC 5和Entity Framework 6。