首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EF代码优先-从代理获取POCO

EF代码优先-从代理获取POCO
EN

Stack Overflow用户
提问于 2012-09-12 07:17:14
回答 1查看 1.7K关注 0票数 3

问题:

在处理动态代理时是否可以在需要序列化它们时提取底层的POCO?

理由:

我需要首先使用EF代码序列化我的POCO实体,但是很快我发现DbContext为我的POCO创建了动态代理,这使得序列化变得很困难。

我尝试了以下几点:

  1. 禁用DbContext中的代理创建,并且只使用纯POCO。这允许我以任何我喜欢的方式序列化实例。唯一的问题是导航属性没有被跟踪,因此,当我想要保存时,我必须手动附加所有相关实体,否则总是会创建新的实体(参见代码示例)。
  2. 在POCO上实现ISerializable接口以手动处理序列化。这是许多工作,不是一个可持续的解决办法。

代码示例。

代码语言:javascript
运行
复制
// 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;

正如你可以想象的那样,当我的实体有更多的关系时,复杂性就会失控。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-12 07:58:10

在处理动态代理时,当我们需要序列化它们时,是否有可能提取底层的POCO?

不,因为没有潜在的POCO -代理不是实体实例的包装器。它直接是实体实例。

您可以使用DataContractSerializerProxyDataContractResolver来序列化代理POCOs,但是序列化代理实体听起来像是在尝试序列化启用了延迟加载的实体--这比您预期的要多,因为每个属性都会被递归加载,直到整个对象图中没有一个没有加载的导航属性。

在使用DataContractSerializer时,还必须通过用[DataContract(IsReference = true)]标记实体和用[DataMember]标记每个可序列化的属性来处理循环引用。

唯一的问题是导航属性没有被跟踪。

没有代理的实体也会被跟踪。跟踪依赖于实体被附加,而不是实体被代理。

当我想要保存时,必须手动附加所有相关实体。

如果要持久化,必须始终附加反序列化实体。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12382982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档