0

我在 .NET 3.5 应用程序中使用 EF v1 和 Velocity 缓存。我的缓存对象是数据库中实体模型的表示。所以我决定将 EF v1 与 POCO 适配器一起使用。所以有一个实体访问层从缓存中读取对象,如果不存在,则从数据库中读取它并立即缓存它。现在在需要更新的用例中,需要在数据库中更新脏 POCO。现在我不能在这里直接使用 POCO 适配器和代理,因为它们需要一个跟踪更改的支持对象。我从未从框架中对适配器对象进行水合,因此不会发生更改检测。我看到的最简单的选择是:

  1. 更新前阅读实体。从 POCO 设置适配器值。让变更检测顺其自然。这会在每次更新之前进行选择,这可能会给许多关联实体带来高昂的代价。
  2. 创建一个新的实体对象。从 POCO 设置实体键和属性。保存更改。即使没有更改属性/关联实体,这也会进行不必要的写入。

我希望我在问题陈述中很清楚。请建议。

4

1 回答 1

0

实际上结果 1. 和 2. 是相同的。您需要完全读取实体(连同关联),以确保将分离对象中的更改转换为实体上下文。这种方法的注意事项是: 1. 在更新之前读取 2. 过时的写入(因为来自分离对象的所有属性都得到更新,我们最终可能会更新一个过时的值,因为我们没有真正改变什么)

我认为没有任何方法可以避免 1. 但是如果 2. 对您的业务需求至关重要(这意味着您不能用过时的值覆盖,请跟踪您正在通过“IsChangedProperty”更改的字段并仅更新这些字段。这个非常痛苦,但不幸的是,EF v4 和 v1 都没有给你任何喘息的机会:(

于 2011-08-09T11:54:29.280 回答