如果我使用.Find()
代替.Where()
来查询对象,并且有人更新了数据库,使内存模型不同步,则实体知道/是实体提醒更改以便更新内存中的模型?
.Find()
是否会让我面临丢失数据的风险?
答案 0 :(得分:1)
是实体提醒更改,以便更新内存中的模型吗?
没有。我从来没有见过这样做的ORM。这是可能的,但不是微不足道的。您可以在Query Notifications in SQL Server中详细了解相关信息。这甚至都不是整个故事,因为一旦你可以收听数据库事件,你就可以决定如何处理客户端。比如,如何处理客户端中也更改的更改值?
但是Find
方法的设计几乎完全相反。它总是尝试从本地缓存返回一个对象。它只查询数据库是否还有对象。因此,如果您愿意,它可以返回陈旧数据。它非常适合于您需要多次使用对象的相对复杂的操作,但不想一直从数据库中获取它。
LINQ查询语句(Find
不是LINQ)位于中间位置。他们会查询数据库,但他们不会更新缓存中的对象。如果您在本地更改了对象,则更改不会被Select
语句删除。
您可以刷新本地缓存,但DbContext
API(这是前ObjectContext
API的改进)甚至比以前更容易。信息是:不要这样做。如果您想要新数据:创建新的上下文。
答案 1 :(得分:0)
.Find()
是否会让我面临丢失数据的风险?
当然,First()
和Where()
也一样。每次将数据加载到内存中时,您可能会在不知情的情况下更改其背后的数据。您可以通过不长时间挂在实体上,并为每个数据库操作(或操作)使用新的上下文来最小化 EF中的风险。