繁体   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