实体框架和数据合约序列化器
本文关键字:序列化 数据 框架 实体 | 更新日期: 2023-09-27 18:05:37
我一直在阅读关于在实体框架上下文中使用Linq to实体和不同可能的序列化器的实体图序列化:Binary, XmlSerializer和DataContractSerializer。正如我所理解的,二进制和XmlSerializer序列化实体而不需要它的关系。如果关系是序列化的,由于结果xml文件结构的性质(对于XmlSerializer),这可能会导致问题。DataContractSerializer序列化图形的整个深度,除非延迟加载被禁用。
我的问题是:我想序列化图的一部分。例如,如果我有一个实体A和三个相关的实体B、C和D,只有B和D会被A序列化。我想使用DataContractSerializer。如果我删除不需要的导航属性的[DataMemberAttribute],会工作吗?
实际上你可以禁用惰性加载,序列化/反序列化,然后重新启用惰性加载。
context.ContextOptions.LazyLoadingEnabled = false;
StackOverflow源
由于属性是静态元数据,您不能在运行时对它们进行更改。如果你将它们从你的实体中移除,它们将被永久移除。
延迟加载可能不是你想要的,因为当你加载时你带来了整个图,部分图场景通常只在更新或部分插入时出现。
你的场景,从我收集的是当你想要更新的东西,你想要更新的部分图,而不是整个图,你在客户端。实现这一点的一种方法是手动删除其他datammembers并将它们设置为空,序列化它们,更新它们,并修复您之前设置的空引用,最后确保ChangeTrackers都处于先前的状态。
在我们特定的开发场景中,我们通过T4模板实现了这种行为,它生成了所有混乱的代码,生成了"DataManager"的一部分,一旦它们存在于客户端上,它就会处理所有的自我跟踪实体。
根据我的经验,禁用延迟加载的唯一可靠方法似乎是进入实体设计器窗口,右键单击后台,选择"属性",并在属性窗口中将"延迟加载启用"设置为false