【问题标题】:EF Code First - Get POCO from ProxyEF Code First - 从代理获取 POCO
【发布时间】:2012-09-12 07:17:14
【问题描述】:

问题:

当我们需要序列化它们时,是否可以在处理动态代理时拉出底层的POCO?

理由:

我需要使用 EF Code First 序列化 (XML) 我的 POCO 实体,但很快发现DbContext 为我的 POCO 创建动态代理,这使得序列化变得困难。

我尝试了以下方法:

  1. DbContext 中禁用代理创建,并且仅适用于纯 POCO。这允许我以任何我喜欢的方式序列化实例。唯一的问题是导航属性没有被跟踪,因此,当我想保存时,我必须手动附加所有相关实体,否则将始终创建新实体(参见代码示例)。
  2. 在 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;

您可以想象,当我的实体拥有更多关系时,复杂性可能会失控。

【问题讨论】:

    标签: c# .net entity-framework ef-code-first


    【解决方案1】:

    是否可以在处理动态代理时拉出 底层 POCO 什么时候需要序列化?

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

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

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

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

    没有代理的实体也会被跟踪。跟踪取决于被附加的实体而不是被代理的实体。

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

    如果你想持久化它们,你必须始终附加反序列化的实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多