在此MSDN链接中提到了以下关于.Find()
方法
如果在上下文中找不到实体,则会向其发送查询 数据库在那里找到实体。如果实体返回Null 在上下文或数据库中找不到。查找不同于 以两种重要方式使用查询:
•往返数据库 只有在找不到具有给定密钥的实体时才会生成 上下文。
•查找将返回处于已添加状态的实体。那 是,Find将返回已添加到上下文中的实体但是 尚未保存到数据库中。
但这会导致问题吗?假设一个对象被标记为已添加状态,但在将其保存到数据库之前发生了异常。因此查找可能会返回具有已添加状态的对象,该对象以后尚未保存到数据库中。
第二个问题,如果.Find在上下文中发现了一个对象,并且在找到它之后在数据库中更新了该对象,那么上下文中的对象版本将会变旧?
那么使用.Find()
而不是使用.Where
或.firstordefault(a=>a.primarykey ==id)
基于主键进行搜索,我可以获得哪些好处?
答案 0 :(得分:1)
文档说明了Find ...
使用主键值尝试查找上下文跟踪的实体。如果实体不在上下文中,则将执行查询并根据数据源中的数据进行评估,
因此它首先搜索缓存。如果缓存中的内容是旧的(或者数据库中不存在 - 也许永远不会存在)那么这就是你得到的。如果它无法在缓存中找到实体,它只会进行查询。我不会说它会因为它的定义而返回“错误”的东西。如果您需要查找可能被其他用户更改的数据,或者确保存在于数据库中的数据,则您需要坚持使用查询。