【问题标题】:Entity Framework error "Sequence contains no elements" after delete statement from proc ran从 proc 运行删除语句后,实体框架错误“序列不包含元素”
【发布时间】:2016-09-26 16:17:34
【问题描述】:

我从 EF 调用存储过程,删除一些记录,然后立即调用查询以获取剩余记录。该查询在其中使用Single(),这会引发错误

序列不包含任何元素

但是在这个错误之后,如果我停止并重新启动代码,它会显示记录就好了。所以我认为删除存储过程正在执行的记录(它正在提交)正在搞乱 EF 上下文。

在存储过程运行后我会调用dbContext.SaveChanges()。为什么 EF DbContext 在从存储过程中运行删除语句后出现查询问题?

【问题讨论】:

  • EF 上下文如何知道您已删除存储过程中的行?
  • 对,这就是问题所在。我怎样才能在没有获得新上下文的情况下解决这个问题,因为这似乎可以解决它。我可以“刷新”当前的数据库上下文吗?
  • 刷新做到了!

标签: c# entity-framework


【解决方案1】:

如果返回剩余记录的查询没有返回任何内容(如,没有更多记录保留),则Single() 将抛出该异常,因为如错误所述,该序列中没有任何元素。如果您改用SingleOrDefault(),则可以返回一个您可以检查的null 对象。

此外,如果返回的剩余记录数组中有超过 1 个元素,此代码将引发异常。

如果您发布一些您正在使用的代码,我将编辑此答案以可能更具体。

【讨论】:

  • 我知道我可以使用 SingleOrDefault() 但更大的问题是为什么 EF 与表的实际外观不同步。当我停止并启动应用程序时,它运行这个查询就好了。是否有关于调用存储过程来更改数据,然后查询数据库上下文的相同实例。
  • 您在Single() 之前运行的代码到底是什么?您希望在重新启动之前 EF 看不到数据库中的结果是什么?
  • EF 调用一个存储过程,并且该过程通过 EF db 上下文从我正在查询的 2 个表中删除记录。
  • 我明白,我要求的是您希望返回的实际记录。来自 EF 的错误说没有记录,您希望看到哪些记录,以及什么是未能看到它们的代码?
  • 表中还有很多其他记录。我要删除一对。我希望看到其他记录。如果我关闭应用程序并重新打开它并运行它一直运行的完全相同的查询,就会发生这种情况。我希望 EF 每次运行时都会返回表,如果某些记录不再存在,它们不应导致此错误(因为当我重新运行应用程序时不会发生此错误)。实际的 EF linq 查询是 proc 删除后失败的原因。看到该查询无济于事,因为它在删除之前和重新启动应用程序之后都可以正常工作。
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2012-11-24
相关资源
最近更新 更多