为什么SQL Server视图不适合使用Entity Framework

时间:2018-06-06 20:07:55

标签: c# entity-framework

我读过这些文章

http://a4academics.com/interview-questions/52-dot-net-interview-questions/973-entity-framework?showall=&start=2

他们说

  

以下是我们可以考虑提高绩效的要点 -

     

如果不需要,请禁用更改跟踪。

     

使用已编译的   在需要时查询。

     

避免使用视图

     

获取所需数据   来自数据库。

1)他们试图避免使用观点。

我们可以在db中查看视图,我们可以通过edmx引用。那么如果我们用EF而不是表调用视图会出现什么问题?

我想知道当我们通过EF调用视图时会发生什么。

由于

1 个答案:

答案 0 :(得分:1)

视图的唯一问题是,它们并不总是包含唯一的候选主键。

视图可以包含

之类的行
ID1 ID2 SomeColumn
==================
  1   4          A
  1   5          A
  1   5          B

其中两个ID列都来自主键表列。

当导入EDMX时,EF会推断出主键,并可能认为{ ID1, ID2 }是一个很好的候选者。如你所见,它不是。在这种情况下,它还应该包含SomeColumn,但在其他情况下甚至可能没有唯一的视图字段组合!

在实体框架6及更早版本中,导致EF实现相同的实体,如

  1 4 A
  1 5 A
  1 5 A (!)

如您所见,第三行是重复的。

这引起了开发人员和许多Stack Overflow问题的极大混淆。只是当视图包含一个适当的唯一候选键(在EF模型中映射为主键)时,使用只读数据的视图是完全可以的。在EF查询中。

这个令人困惑的问题不再在EF6中得到修复,但实体框架核心(从v2.1开始)增加了对读取无法识别的视图数据的支持。视图可以读入任何类型,读取视图只会返回视图行,而不会由非唯一键引起重复: 没有键。

可以通过以下方式将类型添加到模型中:

modelBuilder.Query<MyViewDto>().ToView("MyView");

...并在LINQ查询中使用,如下所示:

db.Query<MyViewDto>().Where(x => x.ID1 == 1)

这将被翻译成带有WHERE子句的SQL查询。