EF 4:使用POCO时无法理解DetectChanges的问题(没有自我跟踪ObjectContext)

时间:2010-10-10 21:38:20

标签: entity-framework entity-framework-4 poco objectcontext

我想知道是否有人可以帮助我?

我在理解为什么需要在我的POCO(非代理)实体上发出DetectChanges时遇到问题。

当然我有这一行来确保不返回代理。

   context.ObjectStateManager.GetObjectStateEntry(order).State

做一些研究似乎我需要检查对象的“状态”然后我需要发出detechChanges但是为什么我需要检查一个对象的状态?

基本上我将我的POCO实体发送到一个方法,该方法将数据保存到新的ObjectContext(我在每个方法上创建并销毁ObjectContext)

因此,我在理解为什么需要使用ObjectContext跟踪或了解更改时遇到问题?

是不是因为如果它不知道是否会被保存?

也许我很想知道但是看起来如果我使用的是现有的ObjectContext(我不是每次都在创建和销毁),确保ObjectContext知道会有益但不是吗?

因此,在1方法中,我通过创建新的datacontext来更新对象,将其保存到db并销毁ObjectContext。因此,我没有使用2种方法,1种方法发送更新或新记录,然后使用另一种方法进行保存。

我真的很感激为什么需要它的快速解释?

提前致谢

1 个答案:

答案 0 :(得分:5)

你的问题有点令人困惑。您正在编写有关Entity Framework但使用与LinqToSql相关的DataContext。

您使用ObjectContext的方式有所不同。从数据库加载POCO实体时ObjectContext将其实例保存在内部标识映射中。默认情况下,POCO不使用任何类型的更改跟踪。当您将该POCO实体保存到ObjectContext的相同实例时,它会在内部调用DetectChanges以将当前实体状态与存储状态进行比较。此比较定义了哪些列必须更新。对DetectChanges的内部调用是默认行为,可以关闭,因此您必须手动调用此方法。

在您的方案中,不使用ObjectContext的相同实例。在这种情况下,您首先必须将POCO实体附加到ObjectContext。 MSDN严格地说,当附加实体时,它被标记为未更改。因此,您必须说实体已更改的ObjectContext。您可以为whole entity执行此操作,或者您可以准确定义哪些properties已更改但您必须手动执行=您必须在某处存储该信息(自我跟踪实体可以帮助您,但他们有ohter disadvantages)。