确实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上。
向我们展示这个动作和视图(cshtml):“当我从这个模型和实体创建一个Controller类时,视图显示没有数据,当我加载网站。” – AaronLS 2013-03-11 21:12:38
Aaron - 我仔细检查了一下,看起来我实际上可以访问我的MVC视图中的SQL视图模型对象,但它并不干净,也不会很好地格式化。我打算使用下面的解决方案之一并重新编码。谢谢! – Skkra 2013-03-11 21:44:33