我一直在阅读关于实体框架上下文中的实体图序列化的文章,使用Linq到实体和不同的可能的序列化程序:二进制、XmlSerializer和DataContractSerializer。正如我所理解的那样,二进制和XmlSerializer在没有关系的情况下序列化实体。在关系序列化的情况下,由于结果的xml文件结构(对于XmlSerializer)的性质,这将导致问题。除非禁用延迟加载,否则DataContractSerializer会序列化整个图的深度。
,我的问题是:我想序列化图的一部分。例如,如果我有一个实体A和三个相关实体B、C和D,那么只有B和D将被A序列化,我想使用DataContractSerializer。如果我删除不想要的导航属性的DataMemberAttribute,这会起作用吗?
发布于 2011-08-12 14:44:06
实际上,您可以禁用延迟加载、序列化/反序列化,然后重新启用延迟加载。
context.ContextOptions.LazyLoadingEnabled = false;
发布于 2011-08-12 09:55:25
因为属性是静态元数据,所以不能在运行时处理它们。如果你将它们从实体中移除,它们将被永久地移除。
延迟加载可能不是您想要的,因为当您加载整个图时,部分图通常只出现在更新或部分插入上。
从我收集到的情况来看,当您想要更新某项内容时,您只想更新部分图,而不是更新客户端上的整个图。实现这一目标的一种方法是移除另一个DataMembers,并将它们设置为null,序列化它们,更新它们,并修复您以前设置的空引用,最后确保ChangeTrackers都处于以前的状态。
在我们的特定开发过程中,我们通过一个T4模板实现了这种行为,该模板生成所有杂乱的代码,生成"DataManager“的一部分,一旦它们存在于客户端上,就会处理所有的自跟踪实体。
发布于 2014-01-18 00:08:29
根据我的经验,禁用延迟加载的唯一可靠方法是转到实体设计器(),在后台右键单击,选择" Properties ",并在Properties窗口中将“Loading”设置为false。
https://stackoverflow.com/questions/7037734
复制相似问题