我首先使用实体框架代码并通过 WCF REST HTTP 接口(interface)公开 northwind 数据库。
我没有公开 OrderDetails 表(订单项),因为创建订单然后通过其他服务分别添加每个所需的 OrderDetail 没有意义。在我看来,它需要是一个要么成功要么失败的原子事务。因此,我在传递给客户端时包含了 Order.OrderDetails 集合,并假设我将在创建或更新订单时获得一个集合。
然而,问题似乎是在重新附加 Order 实体以进行更新时检测到 OrderDetails 集合的更改。可以将订单本身设置为已修改以更新这些属性,但这不会级联到 OrderDetail 项目。所以我可以手动检查并将更新的设置为修改,但问题在于首先确定哪些更新。将新的 OrderDetail 设置为已修改将在尝试保存时导致错误。
我阅读了将新集合项的 ID 设置为 0 的建议,并在服务器中使用它来决定它是新的还是现有的。然而,Northwind 为 OrderDetails 使用了 OrderID 和 ProductID 之间的复合键。这些都必须由客户设置,所以我找不到检测新内容的方法。此外,已删除的 OrderDetail 不会存在于分离图中,我需要找出已删除的内容并明确删除它。
如有任何建议,我们将不胜感激。
public override Order Update(Order entity)
{
dbset.Attach(entity);
DataContext.Entry(entity).State = EntityState.Modified;
foreach (var orderDetail in entity.OrderDetails)
{
DataContext.Entry(orderDetail).State = EntityState.Modified;
}
return entity;
}
最佳答案
我最近被允许开源我不久前为我的雇主所做的一些工作(当然有一些变化)。我实际上写了一个扩展方法来解决这个问题,你可以在http://refactorthis.wordpress.com/2012/12/11/introducing-graphdiff-for-entity-framework-code-first-allowing-automated-updates-of-a-graph-of-detached-entities/得到它。
希望对您有所帮助!
关于c# - 重新附加实体图并检测集合更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7804491/