我正在开发一个将公开WCF服务的应用程序。我在DAL使用Entity Framework 4.1。问题是当我加载一些实体时(比如说有一个订单的客户又有一个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);
现在当我在服务器端收到客户更新的ObjectGraph时,我不知道删除了哪个订单以及修改了哪个订单,因为现在没有更改。如何确定要删除的订单和要修改的订单?有没有办法在Entity Framework 4.1中跟踪对象图中的更改?
注意:之前我使用自我跟踪实体来解决这个问题,但我不得不摆脱STE,因为我的WCF服务也将被Java客户端应用程序使用。因此,STE不适合我。
答案 0 :(得分:3)
我想知道回答你的问题是否有意义,因为看起来你看不懂答案。
你问question about STEs,你得到了关于他们可用性的答案。
您可能没有阅读这些答案,因为您使用了STE,然后您提出了问题how to use STEs in Java client。
令我更加惊讶的是你复制了关于STE和EFv4.1的自己的问题
今天你已经在another your question找到了这个问题的答案。
那么你期待什么答案?如果你没有阅读答案,是否值得回答你的问题?
答案:
DbContext没有STE模板,一旦你不使用STE,你必须handle change tracking completely yourselves,因为EF对你没有帮助。最简单的方法在前一个问题中描述 - 在服务中再次加载对象图并将传入图合并到附加实体,以便上下文可以跟踪更改。更复杂的解决方案在前一个关于STE的问题中提供的链接@Richard中描述 - 您必须为每个转移的实体添加一些状态属性,并且客户端必须正确设置它们并将它们发回给您,以便您可以手动设置正确每个实体一旦附加它们的状态 - 如果有某些关系,这可能有点复杂。
答案 1 :(得分:2)
据我所知,除了自我跟踪实体(您不能按照自己的意思使用)之外,无法跟踪分离对象图的更改。
我通常更新分离图表的做法是从数据库重新加载原始图表,将原始图表与更改的图表(手工编写的代码逐个案例)进行比较,以查看哪些实体已被添加,修改和删除,将更改写入原文并保存上下文。
此过程的示例(对于一个父集合和子集合,例如Customer和Order集合)在此问题的答案中:The relationship could not be changed because one or more of the foreign-key properties is non-nullable
如果你不得不处理更深层次的实体,那很不幸会变得非常复杂。据我所知,EF不提供任何类型的自动合并已更改的图形到原始图形,仅适用于实体仅具有已更改的标量和复杂属性的非常简单的情况。一旦涉及导航属性,您就不再支持EF了,您必须自己编写更新逻辑。