【问题标题】:Saving objects in EntityFramework over WCF causes related entities to be created通过 WCF 在 EntityFramework 中保存对象会导致创建相关实体
【发布时间】:2011-05-19 19:18:05
【问题描述】:

在这个当前项目上,开发人员多次遇到同样的问题:

具有相关实体的对象,即具有相关客户的订单通过 WCF 发送回要保存的实体工作。如果对象是新的,我们使用 AddObject() 将其放回上下文中,如果它已更改,则我们使用 ApplyCurrentValues() 来更新对象。

Order 对象已更改,但 Customer 对象没有更改(除非通过 WCF 的流式传输以某种方式影响它)。但是,当在上下文中调用 SaveChanges() 时,主对象(本例中的 Order)被保存,但 Customer 的新副本也被添加到数据库中。

我们发现的解决方法是在调用 SaveChanges() 之前将 Order 上的 Customer 的引用设置为 null,但这感觉有点麻烦。

我正在寻找解决此问题的“正确”方法,类似于 LazySaving = false,即仅保存更改的对象,不要尝试创建所有相关对象。

提前感谢您的任何指点。

【问题讨论】:

  • 您使用的是 WCF RIA 服务还是您的自定义 WCF?
  • 自定义 WCF,但与现成的 WCF 没有显着的配置差异。

标签: wcf entity-framework


【解决方案1】:

我不确定实体框架,但我最近在使用 NHibernate 时遇到了这个问题。我通过如下实现保存解决了它

(1) 从数据库中检索原始实体
(2) 使用 AutoMapper 从 WCF 数据传输对象更新原始实体
(3) 保存原始实体

我不确定您是否尝试将实体用作 DataContract,根据我的经验,使用数据传输对象而不是实体作为 DataContract 总是更好。如果你不这样做,你会不断地遇到各种麻烦,而 DTO+AutoMapper 让你控制解决你遇到的大多数问题

http://automapper.codeplex.com/

【讨论】:

  • 感谢用户 760940 的快速响应。不幸的是,我没有足够的架构控制来实现这一点。在保存方面,我经历了基本相同的过程,即 1)从数据库加载原始对象(用于更新) 2)使用 ApplyCurrentValues 更新原始对象 3)SaveChanges 遗憾的是,这仍然会创建相关实体的新副本除非我取消这些关系。
  • 保存前加载时原对象有关系吗?
  • 我可以让它加载带有关系的数据。这些可能会针对正在保存的对象进行更改,但要回答您的问题,是的,这是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多