Entity .Find()是否知道DataBase的状态更改?

时间:2015-02-11 18:11:03

标签: linq entity-framework entity-framework-6

如果我使用.Find()代替.Where()来查询对象,并且有人更新了数据库,使内存模型不同步,则实体知道/是实体提醒更改以便更新内存中的模型?

.Find()是否会让我面临丢失数据的风险?

2 个答案:

答案 0 :(得分:1)

  

是实体提醒更改,以便更新内存中的模型吗?

没有。我从来没有见过这样做的ORM。这是可能的,但不是微不足道的。您可以在Query Notifications in SQL Server中详细了解相关信息。这甚至都不是整个故事,因为一旦你可以收听数据库事件,你就可以决定如何处理客户端。比如,如何处理客户端中更改的更改值?

但是Find方法的设计几乎完全相反。它总是尝试从本地缓存返回一个对象。它只查询数据库是否还有对象。因此,如果您愿意,它可以返回陈旧数据。它非常适合于您需要多次使用对象的相对复杂的操作,但不想一直从数据库中获取它。

LINQ查询语句(Find不是LINQ)位于中间位置。他们会查询数据库,但他们不会更新缓存中的对象。如果您在本地更改了对象,则更改不会被Select语句删除。

您可以刷新本地缓存,但DbContext API(这是前ObjectContext API的改进)甚至比以前更容易。信息是:不要这样做。如果您想要新数据:创建新的上下文。

答案 1 :(得分:0)

  

.Find()是否会让我面临丢失数据的风险?

当然,First()Where()也一样。每次将数据加载到内存中时,您可能会在不知情的情况下更改其背后的数据。您可以通过不长时间挂在实体上,并为每个数据库操作(或操作)使用新的上下文来最小化 EF中的风险。