【问题标题】:Entity framework and DataContractSerializer实体框架和 DataContractSerializer
【发布时间】:2011-10-25 15:34:11
【问题描述】:

我一直在阅读有关在实体框架上下文中使用 Linq 对实体和不同可能的序列化器进行序列化的实体图:Binary、XmlSerializer 和 DataContractSerializer。 据我了解,二进制和 XmlSerializer 序列化没有关系的实体。如果关系被序列化,由于生成的 xml 文件结构的性质(对于 XmlSerializer),它会导致问题。 除非禁用延迟加载,否则 DataContractSerializer 会在整个深度中序列化图形。

我的问题是:我想序列化图表的一部分。例如,如果我有一个实体 A 和三个相关的实体 B、C 和 D,则只有 B 和 D 会用 A 序列化。我想使用 DataContractSerializer。如果我删除不需要的导航属性的 [DataMemberAttribute] 会起作用吗?

【问题讨论】:

  • 我将延迟加载属性保持为 true,并使用有限的图表进行了尝试:Northwind 数据库:订单(主要实体)、客户序列化并且员工和订单详细信息不是。但这是一个选择实体的问题。客户在订单旁边的数据模型中没有任何关系,因此对其进行序列化不会造成问题。然而员工是一个更复杂的实体,在不禁用延迟加载的情况下对其进行序列化会在反序列化时引发异常。

标签: c# entity-framework serialization linq-to-entities datacontractserializer


【解决方案1】:

您实际上可以禁用延迟加载、序列化/反序列化,然后重新启用延迟加载。

context.ContextOptions.LazyLoadingEnabled = false;

StackOverflow Source

【讨论】:

    【解决方案2】:

    由于属性是静态元数据,因此您不能在运行时对它们进行处理。如果您将它们从您的实体中删除,它们将被永久删除。

    延迟加载可能不是您想要的,因为当您加载整个图时,部分图场景通常只会在更新或部分插入时出现。

    根据我收集的信息,您的场景是当您想要更新某些内容时,您只想更新部分图表,而不是您在客户端上拥有的整个图表。实现此目的的一种方法是手动删除其他 DataMember 并将它们设置为 null,对其进行序列化、更新,然后它们会修复您之前设置的 null 引用,最后确保 ChangeTracker 都处于之前的状态。

    在我们特定的开发场景中,我们通过 T4 模板实现了这种行为,该模板生成所有杂乱的代码,生成“DataManager”的一部分,一旦它们存在于客户端上就可以处理所有自我跟踪实体。

    【讨论】:

      【解决方案3】:

      根据我的经验,禁用延迟加载的唯一可靠方法似乎是转到实体设计器绕线器,在后台右键单击,选择“属性”,然后将“启用延迟加载”设置为 false属性窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-10
        • 2011-10-11
        • 2020-08-12
        • 2011-08-20
        • 2013-04-13
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多