【问题标题】:WCF, Entity Framework 4.1 and Entity's StateWCF、实体框架 4.1 和实体的状态
【发布时间】:2011-08-10 16:28:39
【问题描述】:

我正在开发一个将公开 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 不是我的选择。

【问题讨论】:

    标签: entity-framework entity-framework-4.1 self-tracking-entities change-tracking dbcontext


    【解决方案1】:

    我想知道回答您的问题是否有意义,因为您似乎没有阅读答案。

    你问过question about STEs,你得到了关于它们可用性的答案。

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

    您可能没有阅读这些答案,因为您使用了 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 中进行了描述-您必须向每个转移的实体添加一些状态属性,并且客户端必须正确设置它们并将它们发回给您,以便您可以手动设置正确为每个实体附加它们后的状态 - 如果存在某些关系,这可能会有点复杂。

    【讨论】:

    • 感谢您的指导。但是,我一直在阅读所有答案。我同意我的几个问题在某种意义上是重复的。我必须这样做以寻求更好、更优雅的解决方案。
    【解决方案2】:

    据了解,除了 Self Tracking Entities(你不能像你说的那样使用它)之外,没有办法跟踪分离对象图的变化。

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

    此过程的一个示例(对于一个父集合和一个子集合,例如 Customer 和 Order 集合)在此问题的答案中:The relationship could not be changed because one or more of the foreign-key properties is non-nullable

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多