EF4 Cast DynamicProxies到底层对象

pet*_*tey 18 c# serialization poco entity-framework-4

我正在使用带有POCO模板的Entity Framework 4.

我有一个List,其中MyObject是动态代理.我想使用XmlSerializer序列化此列表,但我不希望它们序列化为DynamicProxies,而是作为底层POCO对象.

我知道ContextOptions.ProxyCreationEnabled,但我不想使用它.我只是想知道如何将代理对象转换为它的POCO序列化.

Kor*_*yem 7

今天面临同样的问题,并使用Value Injecter来解决它.它很简单:

var dynamicProxyMember = _repository.FindOne<Member>(m=>m.Id = 1);
var member = new Member().InjectFrom(dynamicProxyMember) as Member;
Run Code Online (Sandbox Code Playgroud)


Gor*_*vic 1

由于您不想关闭 ProxyCreation,因此无论您为对象属性添加 virtual 关键字,您都会陷入 DynamicProxy 对象(EF Context 继承您的对象并用 DynamicProxy 对象替换虚拟属性)。这些 DynamicProxy 对象不会从您的 POCO 实体继承,它们只是具有相同的属性,并且可以代替您的 POCO 使用。如果您确实必须转换为 POCO 对象(并且我不相信有人会想出一种方法来转换它),您可以尝试通过编写复制构造函数来解决方法,该构造函数将从传递的参数复制所有属性(不是很聪明)从性能的角度来看,但你必须做什么,你必须做什么),或者可能System.Xml.Serialization.XmlTypeAttribute在包含动态代理的父对象中使用而不是 poco 来告诉序列化程序如何序列化虚拟属性(到哪种类型)。