问题:
当我们需要序列化它们时,在处理动态代理时是否可以拉出底层 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;
您可以想象,当我的实体拥有更多关系时,复杂性可能会失控。