栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么实体框架的DbContext.Find()会生成一个带有选择顶部2的查询?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么实体框架的DbContext.Find()会生成一个带有选择顶部2的查询?

Find
首先检查具有给定键的实体是否已在上下文中。如果不是,它将查询数据库。在这种情况下,它可能使用的LINQ查询
SingleOrDefault
。如果结果具有多个实体,则
SingleOrDefault
转换为
SELECTTOP 2
能够引发异常。

因此,为什么不

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

真的只是一个假设。只有EF开发团队可能可以回答确切的原因。

编辑

如果我如上所述进行此操作(将列添加到数据库中的复合键,并在第一键列中添加具有相同值的记录)并调用then

Find
,则会得到异常…

序列包含多个元素

…以及此堆栈跟踪:

//...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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393744.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号