c# - 重新附加实体图并检测集合更改

标签 c# entity-framework rest entity-framework-4.1

我首先使用实体​​框架代码并通过 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/

相关文章:

php - 服务器端 Twitter 客户端可以使用 OAUTH 吗?

rest - 如何从 Axomic OpenAsset REST API 构建图像 url

c# - 如何在 dotnet 核心中为 HttpClient 指定 HTTP/2 "prior knowledge"模式?

c# - 将char数组转换为int数组c#

c# - SMO 备份失败并出现错误 1827(完整数据库)

c# - Dot Net Entity Framework 数据库更新不会在 mysql 数据库中创建表

c# - 使用文本框过滤列表框项目

asp.net-mvc-3 - 使用 MVC 3 和 EF 更新模型中的一个字段

c# - Entity Framework 获取 sql 连接

json - 在 Swift 中使用 Alamofire 发送包含字典对象数组的字典对象时,会发生奇怪的行为吗?