.net - 为什么 Entity Framework 的 DbContext.Find() 会生成带有 select top 2 的查询?

标签 .net sql entity-framework-4.1

为什么 Entity Framework 的 DbContext.Find() 会生成一个包含 select top 2 和派生表的查询?根据定义,查询是通过主键查找的,主键应该是唯一的。

最佳答案

Find 首先检查具有给定键的实体是否已在上下文中。如果没有,则查询数据库。在本例中,它可能使用 SingleOrDefault 的 LINQ 查询。 SingleOrDefault 转换为 SELECT TOP 2,以便在结果有多个实体时能够引发异常。

那么,为什么Find不使用FirstOrDefault(这将转换为SELECT TOP 1)。我不知道,但我猜 Find 想要检查该实体在数据库中是否确实唯一。它应该 - 因为它是查询使用的主键 - 但模型和数据库可能不同步,因为有人更改了数据库中的主键,例如:将列添加到数据库中的复合键但不在模型中。

实际上只是一个假设。大概只有EF开发团队才能回答到底是什么原因。

编辑

如果我按照上面的描述执行此操作(将列添加到数据库中的复合键,并在第一个键列中添加具有相同值的记录),然后调用 Find,我会得到异常。 .

Sequence contains more than one element

...以及这个堆栈跟踪:

//...
System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
System.Data.Entity.Internal.Linq.InternalSet`1.FindInStore(
    WrappedEntityKey key, String keyValuesParamName)
System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues)
System.Data.Entity.DbSet`1.Find(Object[] keyValues)

因此,看起来 Find 确实使用了 SingleOrDefault

关于.net - 为什么 Entity Framework 的 DbContext.Find() 会生成带有 select top 2 的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822877/

相关文章:

c# - 使用嵌套 Where (LINQ) 子句优化数组迭代

.net - 向 IoC 容器注册类型应该由谁负责?

c# - SPML (service provisioning markup language)/C#.Net 请帮忙!

c# - 用一种方法打开文件,用另一种方法写入

mysql - 查询优化问题

Mysql:如果行不安全地存在且具有键和唯一属性,则插入

php - 简单的mysql查询来检查行是否存在

asp.net-mvc-3 - 为什么 MVC3 没有为我的外键列搭建脚手架

entity-framework - Entity Framework 4.1 查询需要很长时间(5 秒)才能完成

entity-framework - System.Drawing.Image EntityType 'Image' 没有定义键。定义此 EntityType 的键