1

我可以使用 ef 5 跟踪子实体的变化吗?

例子:

领域对象:书籍(一对多)页面

var oldBook = context.Books.Include("Pages");
context.Entry(oldBook).CurrentValues.SetValues(updatedBook);

此代码将使用 updatedBook 对象的简单属性值更新旧书对象的简单属性。

有什么方法可以跟踪儿童收藏吗?(在这种情况下为页面)。或任何最佳实践如何做到这一点?

4

1 回答 1

4

你的问题有点模棱两可。

我可以使用 ef 5 跟踪子实体的变化吗?

当然,除非您使用IQueryable.AsNoTracking()or明确禁用更改跟踪,否则MergeOption.NoTracking您可以跟踪附加到DBContext ObjectStateManager.

如果您真的在询问是否有可以执行此操作的功能:

context.Entry(oldBook).CurrentValues.SetValues(updatedBook);

然后将整个对象图的当前值(其中 oldbook 是根)设置为 updatedBook 对象图的更新值,不。

您必须循环访问并调用context.Entry(oldPage).CurrentValues.SetValues(updatedPage)您希望更新的每个页面。

我认为您处于断开连接的场景中,您不能只是从数据库中提取实体并使用自动更改跟踪并直接在跟踪的实体上设置修改后的值,否则您可以只使用附加到的单个对象图上下文而不是使用两个实例(即旧书、更新书)。

如果您已经有一个分离的修改对象图,您需要使用替代方法来从数据库中检索实体并使用SetValues()是将实体附加到修改后的上下文。您仍然需要循环并为对象图中的所有实体执行相同的操作。

context.Entry(updatedBook).State = EntityState.Modified;
foreach(var p in updatedBook.Pages) context.Entry(p).State = EntityState.Modified;
context.SaveChanges();
于 2013-02-06T22:31:48.197 回答