0

我正在开发一个将公开 WCF 服务的应用程序。我在 DAL 使用实体框架 4.1。问题是当我加载一些实体时(假设一个具有 Order 的客户又具有 OrderDetail)。加载后,我对 Customer、Order 和 OrderDetail 对象进行了一些更改(添加了一些新订单,删除/更新了一些现有订单)并将对象图发送到 WCF 服务以更新它,如下所示。

Customer oCustomer;
using(var context = new MyContext) //MyContext is dbContext
{
    oCustomer = context.Include("Order.OrderDetail").Find(1);
}

oCustomer.Name ="blah blah";
Order oOrder1 = oCustomer.Order.Where(obj=>obj.Id == 2);
oOrder1.Description = "blah blah";
oOrder1.OrderDetail.Quantity = 10;

Order oOrder2 = new Order { ... } //properties of Order are set.
oCustomer.Order.Add(oOrder2);

oCustomer.Order.Remove(context.Order.Find(1));

ServiceClient client = new ServiceClient();
client.SaveCustomer(oCustomer);

现在,当我在服务器端收到更新的客户对象图时,我不知道哪个订单被删除,哪个订单被修改,因为现在没有更改跟踪。如何确定要删除的订单和修改的订单?有什么方法可以在 Entity Framework 4.1 中跟踪我的对象图的变化?

注意:以前我使用自我跟踪实体解决了这个问题,但我不得不摆脱 STE,因为我的 WCF 服务也将被 Java 客户端应用程序使用。因此,STE 不是我的选择。

4

2 回答 2

3

我想知道回答你的问题是否有意义,因为看起来你没有阅读答案。

你问了关于 STE的问题,你得到了关于它们可用性的答案。

  • 我添加了链接,其中明确描述了它们不适用于可互操作的场景
  • Richard 发布了关于 STE 和自定义更改跟踪的非常好的链接 - 顺便说一句。这正是您现在正在寻找的

您可能没有阅读这些答案,因为您使用了 STE,然后您问了一个问题如何在 Java 客户端中使用 STE

更令我惊讶的是,您重复了自己关于 STE 和 EFv4.1 的问题

今天你已经在另一个你的问题中得到了这个问题的答案。

那么你期待什么答案呢?如果您不阅读答案,是否值得回答您的问题?

回答:

DbContext 没有 STE 模板,一旦您不使用 STE,您必须完全自己处理更改跟踪,因为 EF 无法帮助您。您之前的问题中描述了最简单的方法 - 在服务中再次加载对象图并将传入图合并到附加实体,以便上下文可以跟踪更改。更复杂的解决方案在您以前关于 STE 的问题之一中提供的链接@Richard 中进行了描述-您必须向每个转移的实体添加一些状态属性,并且客户端必须正确设置它们并将它们发回给您,以便您可以手动设置正确一旦你附加它们,每个实体的状态 - 这可能有点复杂,以防某些关系。

于 2011-08-10T17:48:18.973 回答
2

据了解,除了自我跟踪实体(您不能按照您所说的那样使用)之外,没有办法跟踪分离对象图的变化。

我通常更新分离图的做法是从数据库中重新加载原始图,将原始图与更改后的图进行比较(逐个手写代码),查看添加、修改和删除了哪些实体,写入更改进入原始文件并保存上下文。

此过程的一个示例(对于一个父集合和一个子集合,例如 Customer 和 Order 集合)在此问题的答案中:无法更改关系,因为一个或多个外键属性不可为空

不幸的是,如果您必须处理更深层次的实体,它会变得相当复杂。据我所见,EF 不提供将已更改图形自动合并到原始图形中的任何类型,仅适用于实体仅具有已更改的标量和复杂属性的非常简单的情况。一旦涉及导航属性,您就不再有 EF 的支持,您必须自己编写更新逻辑。

于 2011-08-10T17:47:29.787 回答