2013-03-11 73 views
4

我是ASPNET和MVC 4的全新品牌,所以我想这可能是一个简单的问题。但是,我一直无法正确谷歌答案。我只是想显示一些销售信息 - 我只需要需要显示它。我不需要插入,更新或从基础表中删除。实体框架 - 从视图创建模型?

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

我去MODELS,添加一个新的ADO.NET实体数据模型,并添加我的视图到模型。它回来并说 “表/视图'vw_FullView'没有定义主键 该键已被推断,并且定义被创建为只读表/视图。” 当我从这个模型和实体创建一个Controller类时,当我加载网站时,该视图不显示任何数据。但是,如果我创建一个完全空白的表格(具有适当的主键)作为模型表格,然后使用存储过程(作为函数导入)来检索我需要的数据,所有东西都可以完全工作精细。

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

非常感谢提前。

+0

向我们展示这个动作和视图(cshtml):“当我从这个模型和实体创建一个Controller类时,视图显示没有数据,当我加载网站。” – AaronLS 2013-03-11 21:12:38

+0

Aaron - 我仔细检查了一下,看起来我实际上可以访问我的MVC视图中的SQL视图模型对象,但它并不干净,也不会很好地格式化。我打算使用下面的解决方案之一并重新编码。谢谢! – Skkra 2013-03-11 21:44:33

回答

3

实体框架不太喜欢视图。它无法弄清楚视图的主键是什么,所以它假设任何不可为空的字段都是复合主键的一部分。

通常,使用实体框架时避免视图。创建一个linq查询来完成你的视图,然后使用它。

+0

问题在于,如果您需要从另一个数据库提取数据,则视图应该是必需的。 EF一次只查看一个数据库,但通过查看,您可以获取信息。 – sksallaj 2014-02-20 23:46:37

+0

@sksallaj - 不,不要为此使用视图。使用Sql服务器同义词。您可以像创建普通表一样为它们创建Code First模型,并且它们的工作方式类似于表格..而不是视图。 edmx文件很难,但仍然可以完成。 – 2014-02-20 23:53:48

+0

如何将同义词添加到实体框架?我有同义词,但没有得到任何承认。事实上,我认为这是一个从未实现的请求的EF功能。 – sksallaj 2014-02-21 00:05:01

1

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

simmdan实际上没有很好地解释了如何解决这个在MSDN forum

基本上,空军终于文已经指出的那样,如果你使用实体框架,最简单的方法是用真正的克隆你的看法实体加入并由linq过滤。

+0

我明白了。由于各种业务限制,我试图避免使用LINQ,并通过驻留在SQL中的存储过程处理/映射所有内容。我想我必须想办法解决这个问题,或者简单地咬紧牙关并使用LINQ。 – Skkra 2013-03-11 21:34:39

+0

btw。你可以使用默认的sqlconnection并直接使用你的存储过程读取/更新你的视图 – Ingo 2013-03-11 22:01:49

+0

@Skkra - 如果你不想使用linq,你为什么使用Entity Framework呢? – 2013-03-12 23:00:02

0

确实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上。