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