我读过这些文章
他们说以下是我们可以考虑提高绩效的要点 -
如果不需要,请禁用更改跟踪。
使用已编译的 在需要时查询。
避免使用视图
获取所需数据 来自数据库。
1)他们试图避免使用观点。
我们可以在db中查看视图,我们可以通过edmx引用。那么如果我们用EF而不是表调用视图会出现什么问题?
我想知道当我们通过EF调用视图时会发生什么。
由于
答案 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查询。