【发布时间】:2012-09-12 07:17:14
【问题描述】:
问题:
当我们需要序列化它们时,是否可以在处理动态代理时拉出底层的POCO?
理由:
我需要使用 EF Code First 序列化 (XML) 我的 POCO 实体,但很快发现DbContext 为我的 POCO 创建动态代理,这使得序列化变得困难。
我尝试了以下方法:
- 在
DbContext中禁用代理创建,并且仅适用于纯 POCO。这允许我以任何我喜欢的方式序列化实例。唯一的问题是导航属性没有被跟踪,因此,当我想保存时,我必须手动附加所有相关实体,否则将始终创建新实体(参见代码示例)。 - 在 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