1

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

我无法理解为什么我需要在我的 POCO(非代理)实体上发出 DetectChanges。

当然,我有这条线来确保不返回代理。

   context.ObjectStateManager.GetObjectStateEntry(order).State

并且做一些研究,如果我需要检查对象的“状态”,那么我需要发出 detechChanges 但是为什么我需要检查对象的状态?

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

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

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

也许我错过了通知,但似乎如果我使用现有的 ObjectContext(我不是我每次都在创建和销毁)确保 ObjectContext 知道将是有益的,但否则不是?

所以在一种方法中,我通过创建一个新的数据上下文来更新一个对象,将其保存到数据库并销毁 ObjectContext 。因此我没有使用两种方法,一种方法发送更新或新记录,然后另一种方法用于保存。

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

提前致谢

4

1 回答 1

5

你的问题有点令人困惑。您正在撰写有关实体框架的文章,但使用的是与 LinqToSql 相关的 DataContext。

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

在您的场景中,您没有使用相同的 ObjectContext 实例。在这种情况下,您首先必须将 POCO 实体附加到 ObjectContext。MSDN严格规定,在附加实体时,它被标记为未更改。出于这个原因,您必须说 ObjectContext 该实体已更改。您可以为整个实体执行此操作,或者您可以准确定义哪些属性已更改,但您必须手动执行=您必须将该信息存储在某处(自我跟踪实体可以帮助您,但它们有其他缺点)。

于 2010-10-11T08:06:46.580 回答