2012-03-13 23 views
12

He leído que los proxies se usan cuando necesitamos usar Lazy Loading y Change Tracking. En otras palabras, para usar Lazy Loading debo habilitar proxies.EF 4 - Lazy Loading Sin Proxies

Hasta ahora todo bien.

el punto es que puedo usar el código de abajo para configurar el contexto de no usar un proxy e incluso todavía utilizar la carga diferida.

ctx = new SchoolEntities(); 
ctx.ContextOptions.ProxyCreationEnabled = false; 
ctx.ContextOptions.LazyLoadingEnabled = true; 

¿La propiedad ProxyCreationEnabled está relacionada solo con el proxy de seguimiento de cambios o me falta algo?

¿Podría alguien explicar esto con algunos detalles?

Gracias!

EDIT1

no estoy usando POCO/DbContext. Estoy usando un modelo regular de EF de edmx con ObjectContext. Sé la importancia de los poderes para las entidades de POCO en lo que respecta al cambio de seguimiento y la carga diferida. ¿Por qué usar Proxies en un modelo regular de EDMX?

Respuesta

10

Al utilizar entidades POCO con las funciones integradas de Entity Framework, la creación de proxy debe estar habilitado para poder utilizar la carga diferida. Entonces, con las entidades POCO, si ProxyCreationEnabled es falso, la carga diferida no ocurrirá aunque LazyLoadingEnabled se establezca en verdadero.

Con ciertos tipos de entidades heredadas (especialmente aquellas derivadas de EntityObject) este no era el caso y la carga lenta funcionaría incluso si ProxyCreationEnabled se establece en falso. Pero no interprete que debe usar entidades EntityObject, eso le causará más dolor.

El indicador ProxyCreationEnabled normalmente se establece en falso cuando desea asegurarse de que EF nunca creará un proxy, posiblemente porque esto causará problemas para el tipo de serialización que está realizando.

La bandera LazyLoadingEnabled se usa normalmente para controlar si la carga diferida ocurre o no en todo el contexto una vez que ha decidido que los proxies son correctos. Entonces, por ejemplo, es posible que desee usar proxies para el seguimiento de cambios, pero desactive la carga diferida.

+0

voy a mantener en mente que 'EntityObject' es una "entidad legado" :) ¿Cuándo se empieza a marcar con el atributo' '[obsoleto]? – Slauma

+0

Buena pregunta. Lo cual no puedo responder porque no sé si sucederá alguna vez. Pero lo hemos discutido. –

+0

@ajcvickers, gracias por su respuesta, pero, a menos que no entienda correctamente, creo que se perdió la parte más importante de la pregunta: si estoy usando ObjectContext (y no DbContext), ¿para qué se usa ProxyCreationEnabled? Para habilitar Change Track? Cómo he indicado antes, esto no es para la carga lenta, entonces, ¿para qué sirve? – outlookrperson