【问题标题】:Restrict Serializing Entire Object Graph When Calling WCF Service to Update a EntityObject调用 WCF 服务更新 EntityObject 时限制序列化整个对象图
【发布时间】:2010-04-01 12:37:32
【问题描述】:

我们有一个使用实体框架查询 SQL 数据库的 WCF 服务。 WCF 服务是我们的数据访问层。如果我们的任何应用程序从数据库读取/写入数据,我们调用 WCF 服务上的方法。 WCF 服务将 EntityObject 序列化到客户端应用程序。

在客户端应用程序(例如 WPF 应用程序或 ASP.NET 应用程序)中,我们可以更新实体属性并调用 WCF 服务,将实体作为参数传递,以执行数据库更新。被更新的实体可能有数百个与之相关的子实体。

例如,客户实体将具有项目属性,该属性是项目实体的列表。如果我们的客户端应用程序更改了客户实体上的简单标量属性,例如 CustomerName,我们需要通过调用 WCF 服务上的更新方法将该更改保存到数据库中。问题是,我们将 Customer 实体传递给要更新的服务,但所有附加的项目也被序列化并传递给 WCF 服务,即使 WCF 服务更新方法只涉及对 Customer 上的标量属性的更改实体。显然,我们正在序列化和传输比需要更多的数据。

有人遇到过这个问题吗?不知何故,我只想将 Customer 实体序列化回 WCF 服务,而不对整个对象图进行深度序列化。

谢谢。

【问题讨论】:

    标签: .net wcf entity-framework serialization


    【解决方案1】:

    您可以使用 DataAnnotations 限制要传输的内容, 或者更好的方法是,您在要通过有线传输的数据上创建自己的模型。在这里,所有意图(数据库之间的映射、服务和客户端之间的映射)都有自己的专用模型。

    两个模型之间的映射可以通过 automapper 轻松完成。

    【讨论】:

      【解决方案2】:

      您可以使用DataContractSerializer 对象的maxItemsInObjectGraph 属性来限制序列化。您可以通过在行为配置中使用configuration element 轻松尝试。比如

      <behaviors> <behavior name="CustomerUpdate"> <dataContractSerializer maxItemsInObjectGraph="1" /> </behavior> </behaviors>

      我能想到的另一个选择是创建一个DataContract Surrogate 来删除您不想序列化的信息。为此,您应该创建一个实现IDataContractSurrogate 的类并使用GetObjectToSerialize 方法修改客户实体以不包含任何相关实体集合。

      这种方法确实让我很困扰,原因有很多

      • 这需要付出很多努力,您最终可能会构建一个行为来简化重用,但这并不能避免最初的努力
      • 我想不出针对所有实体处理此问题的通用方法(除非您决定不发送所有集合或可枚举属性)

      所以我肯定会先尝试使用maxItemsInObjectGraph

      HTH

      【讨论】:

        【解决方案3】:

        我正在使用休眠 (Java/grails) 并尝试实现 Hessian 并遇到完全相同的问题 - hessian 似乎通过尝试序列化整个对象图但我只想要一个对象。你遇到解决方案了吗? hessian 文档并不精确,错误,充满了信息或配置选项。

        【讨论】:

        • 不,我还没有找到解决方案。
        【解决方案4】:

        好吧,要找到解决这个问题的方法并不容易......实际上,您需要跟踪实体中的更改并将它们分别标记为脏,然后仅将 CURD/ 操作应用于对象图中那些有脏的实体标志设置。

        这是一个类似的讨论: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/89b7087a-1b08-4fe0-9cc3-68986fe89a74

        问候。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多