当前位置: 首页 > 面试题库 >

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

姚文轩
2023-03-14
问题内容

为什么实体框架的DbContext.Find()会生成带有选择顶部2和派生表的查询?根据定义,查询是通过主键查找的,该键应该是唯一的。


问题答案:

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

因此,为什么不Find使用FirstOrDefault(将转换为SELECT TOP 1)。我不知道,但我想我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



 类似资料:
  • 问题内容: 我有以下代码: 最后一行输出生成的SQL。这是我得到的: 您会看到,虽然有-from-,但它完全是多余的- 一个就足够了。尽管表很小,但使用EF的代码在该查询上运行的时间超过半分钟,并且超时。 为什么会生成此过度设计的SQL查询?如何使EF生成更好的查询? 问题答案: 它通过转换表达式树来生成结果SQL。似乎过度设计(例如,使用子查询)是完成转换方式的副作用。转换的细节是专有且复杂的,

  • 问题内容: 我尝试通过使用实体框架连接MySql数据库,但Visual Studio不想生成* .edmx? 我在db中有1个表, -选择ado.net edm,- 选择从数据库生成 -选择 db-在这里我认为我应该选择表,但是 向导关闭 我尝试使用其他版本的EF,但是仍然无法正常工作。问题是什么? 我的软件: -Windows 7 * 64 -vs 2017社区 -mySql 8.0社区 问题答

  • 本文向大家介绍你们项目为什么会选vue而不选择其它的框架呢?相关面试题,主要包含被问及你们项目为什么会选vue而不选择其它的框架呢?时的应答技巧和注意事项,需要的朋友参考一下 Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API;vue是单页面应用,使页面局部刷新,不用每次跳转页面都要请求所有数据和dom,这样大大加快了访问速度和提升用户体验。而且他的第三方ui库很多

  • 问题内容: 我正在将子系统从 NHibernate 移植到 Entity Framework, 并希望看到将以下查询移植到 EF 的最佳方法。 帐户余额类别为: 该表是: 示例数据是(使用数字ID可以更好地理解): 该 AccountBalanceByDate 实体持有某一天的账户余额。如果某天没有交易,则该天将没有 AccountBalanceByDate ,我们应该查看前几天以查看该帐户的余额

  • 问题内容: 使用实体框架返回人名列表,其中人名包含字符串数组中的文本。 比方说: 和查询 这将编译并运行,但是该过程实际上是从数据库中调用所有记录,然后对返回的数据执行我的where子句。这是有道理的。 有没有一种方法可以重写查询,以便在SQL中生成where子句? 问题答案: 我假设dataContext.People是来自的,并且不涉及实现的指令,例如或。 答案在这里:http : //www

  • 问题内容: 如果我有一个内部类,像这样: 编译时,我希望它会生成两个文件: 那么,为什么即使SomeClass不包含名为“ 1”的内部类,有时我还是还是会看到类似SomeClass $ 1.class的类文件? 问题答案: SomeClass $ 1.class代表匿名内部类 在这里查看匿名内部类部分