CanFind方法在多用户环境中返回错误的结果

时间:2013-08-13 22:08:59

标签: c# entity-framework

在此MSDN链接中提到了以下关于.Find()方法

的内容
  

如果在上下文中找不到实体,则会向其发送查询   数据库在那里找到实体。如果实体返回Null   在上下文或数据库中找不到。查找不同于   以两种重要方式使用查询:

     

•往返数据库   只有在找不到具有给定密钥的实体时才会生成   上下文。

     

•查找将返回处于已添加状态的实体。那   是,Find将返回已添加到上下文中的实体但是   尚未保存到数据库中。

但这会导致问题吗?假设一个对象被标记为已添加状态,但在将其保存到数据库之前发生了异常。因此查找可能会返回具有已添加状态的对象,该对象以后尚未保存到数据库中。

第二个问题,如果.Find在上下文中发现了一个对象,并且在找到它之后在数据库中更新了该对象,那么上下文中的对象版本将会变旧?

那么使用.Find()而不是使用.Where.firstordefault(a=>a.primarykey ==id)基于主键进行搜索,我可以获得哪些好处?

1 个答案:

答案 0 :(得分:1)

文档说明了Find ...

  

使用主键值尝试查找上下文跟踪的实体。如果实体不在上下文中,则将执行查询并根据数据源中的数据进行评估,

因此它首先搜索缓存。如果缓存中的内容是旧的(或者数据库中不存在 - 也许永远不会存在)那么这就是你得到的。如果它无法在缓存中找到实体,它只会进行查询。我不会说它会因为它的定义而返回“错误”的东西。如果您需要查找可能被其他用户更改的数据,或者确保存在于数据库中的数据,则您需要坚持使用查询。