【问题标题】:Serialize to ASP.NET ViewState using DataContract/DataMember attributes of EF POCOs使用 EF POCO 的 DataContract/DataMember 属性序列化为 ASP.NET ViewState
【发布时间】:2013-11-26 10:26:11
【问题描述】:

我有一系列 EF POCO,它们具有 DataContract 属性,并且 DataMember 属性用于所有属性,导航属性除外

这样,当我为 WCF 序列化对象时,只序列化所需的属性,而忽略导航属性。

如果我尝试将这些对象之一存储在 ViewState 中,则会收到该对象不可序列化的错误。但是,如果我将 Serializable 属性添加到对象,序列化程序也会尝试序列化所有导航属性,这反过来要求它们也被标记为可序列化。

有没有办法强制ViewState (StateBag) 使用DataContract 属性?是否可以自定义或替换ViewState 序列化?

如果不可能,我是否必须为类使用Selializable 属性,为所有导航属性使用NotSerialized,还是有更好的解决方案?

【问题讨论】:

    标签: asp.net entity-framework serialization webforms poco


    【解决方案1】:

    有一个更好的解决方案 - 不要混合域。当您为 WCF 序列化对象时,您正在进入一个不同的域 - 数据传输对象的域,简称 DTO。

    DTO 与您的持久对象分开,它们没有复杂的导航属性,而是包含客户端所需的唯一数据。

    一种常见的做法是使用 Automapper 或类似的子系统轻松地与 DTO 进行转换。

    http://en.wikipedia.org/wiki/Data_transfer_object

    【讨论】:

    • 感谢您的回答。我通常使用 ValueInjecter。在这种情况下,我有一个混合 WebForms - MVC - WCF,并且我有 MVC 模型(这种情况下的 DTO)。但是,我不想为 WebForms 部分维护额外的类(正在从应用程序中慢慢删除)。在这一点上,我正在使用一个 T4 模板,它从数据库中生成所有类......恐怕我必须扩展它来生成 WebForms 所需的类,并将它们映射到 EF POCO,或者添加缺少的 Serializable/NotSerialized 属性(但我不知道如果我将 DataContrat/DataMember 与它们混合会发生什么)。
    猜你喜欢
    • 2012-07-03
    • 2011-06-17
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多