Entity .Find() 是否知道数据库的状态更改?

Is Entity .Find() aware of state changes to the DataBase?

如果我使用 .Find() 而不是 .Where() 来查询一个对象,并且有人更新了数据库使内存模型不同步,实体 know/is 实体是否被警告更改以便更新内存中的模型?

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

Does .Find() expose me to the risk of missing data?

当然可以,但是 First()Where() 也是。任何时候将数据加载到内存中,都会冒着数据背后的数据在您不知情的情况下发生变化的风险。您可以 最小化 通过不长时间挂在实体上并为每个 DB 操作(或操作)使用新的上下文来减少 EF 中的风险。

is Entity alerted to the change so that it updates the model in memory?

没有。我从未见过这样做的 ORM。这是可能的,但并非微不足道。您可以在 Query Notifications in SQL Server 中阅读更多相关信息。这还不是全部,因为一旦您可以收听数据库事件,您就必须决定在客户端如何处理它们。例如,如何处理客户端中 更改的更改值?

但是 Find 方法的设计几乎是相反的。它总是尝试 return 本地缓存中的对象。如果对象还不存在,它只会查询数据库。因此,如果您愿意,它旨在 return 陈旧数据。它非常适合相对复杂的操作,在这些操作中您将多次需要一个对象,但又不想一直从数据库中获取它。

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

你可以刷新本地缓存,但是 DbContext API,这是对前者 ObjectContext API 的改进,甚至让刷新变得不那么容易了比以前。信息是:不要这样做。如果您想要新数据:创建一个新的上下文。