问题:
在处理动态代理时是否可以在需要序列化它们时提取底层的POCO?
理由:
我需要首先使用EF代码序列化我的POCO实体,但是很快我发现DbContext为我的POCO创建了动态代理,这使得序列化变得很困难。
我尝试了以下几点:
DbContext中的代理创建,并且只使用纯POCO。这允许我以任何我喜欢的方式序列化实例。唯一的问题是导航属性没有被跟踪,因此,当我想要保存时,我必须手动附加所有相关实体,否则总是会创建新的实体(参见代码示例)。ISerializable接口以手动处理序列化。这是许多工作,不是一个可持续的解决办法。代码示例。
// Attach and update tags
foreach (var tag in entity.Tags)
{
Context.Entry(tag).State = Context.Tags.Any(t => t.ID == tag.ID)
? EntityState.Modified
: EntityState.Added;
}
// Attach and update state.
Context.Entry(entity).State = Context.Resources.Any(x => x.ID == entity.ID)
? EntityState.Modified
: EntityState.Added;正如你可以想象的那样,当我的实体有更多的关系时,复杂性就会失控。
发布于 2012-09-12 07:58:10
在处理动态代理时,当我们需要序列化它们时,是否有可能提取底层的POCO?
不,因为没有潜在的POCO -代理不是实体实例的包装器。它直接是实体实例。
您可以使用DataContractSerializer和ProxyDataContractResolver来序列化代理POCOs,但是序列化代理实体听起来像是在尝试序列化启用了延迟加载的实体--这比您预期的要多,因为每个属性都会被递归加载,直到整个对象图中没有一个没有加载的导航属性。
在使用DataContractSerializer时,还必须通过用[DataContract(IsReference = true)]标记实体和用[DataMember]标记每个可序列化的属性来处理循环引用。
唯一的问题是导航属性没有被跟踪。
没有代理的实体也会被跟踪。跟踪依赖于实体被附加,而不是实体被代理。
当我想要保存时,必须手动附加所有相关实体。
如果要持久化,必须始终附加反序列化实体。
https://stackoverflow.com/questions/12382982
复制相似问题