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 的改进,甚至让刷新变得不那么容易了比以前。信息是:不要这样做。如果您想要新数据:创建一个新的上下文。
如果我使用 .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 的改进,甚至让刷新变得不那么容易了比以前。信息是:不要这样做。如果您想要新数据:创建一个新的上下文。