为什么 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/