我可以使用ef 5跟踪子实体的更改吗?
示例:
域对象:预订(一对多)页面
var oldBook = context.Books.Include("Pages");
context.Entry(oldBook).CurrentValues.SetValues(updatedBook);
此代码将使用updatedBook对象中的简单属性值更新旧书对象的简单属性。
有没有办法跟踪儿童收藏?(在这种情况下是页面)。或者任何最佳实践如何做到这一点?
答案 0 :(得分:4)
你的问题有点含糊不清。
我可以使用ef 5跟踪子实体的更改吗?
当然,除非您使用IQueryable.AsNoTracking()
或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();