c# - mvc - ¿Por qué EF está devolviendo una clase proxy en lugar de la entidad real?
entity framework database first (4)
De forma predeterminada, EF utiliza el seguimiento de cambios y utiliza un caché en memoria de todas las entidades. Puede utilizar diferentes opciones de combinación cuando trabaje con EF. De forma predeterminada, EF 4.1 se establece en la opción de combinación de anexos. Según tengo entendido, esto significa que si ya ha consultado a una entidad, las consultas posteriores obtendrán la entidad de la memoria caché (si no hay cambios detectados en la base de datos). Así que podrías estar viendo que la entidad en caché regresa.
En EF 4.1, puede utilizar la opción de combinación NoTracking. Esto irá a la base de datos para cada llamada.
Estoy teniendo problemas con el marco de entidad que devuelve Proxies cuando quiero la clase de entidad real. La primera vez que ejecuto mi código, todo funciona correctamente (sin proxies), pero después de cada iteración, uno de mis DbSets siempre devuelve proxies en lugar del tipo real.
Dispongo del contexto después de cada iteración, por lo que no entiendo por qué la primera vez que funciona, y después no.
Mi código falla en esta línea. Todos mis POCO tienen el conjunto de atributos de Tabla, pero debido a que está devolviendo una clase de proxy, no hay ningún atributo de tabla.
TableAttribute attrib = (TableAttribute)attributes.Single();
¿Hay algo de magia estática detrás de escena en el DbContext que vive después de que destruyo el objeto?
Muevo mis objetos a la memoria usando lo siguiente
MajorClasses = ctx.MajorClasses.ToArray();
Yo tambien lo intenté
MajorClasses = ctx.MajorClasses.AsNoTracking().ToArray();
En mi OnModelCreating tengo el siguiente conjunto
base.Configuration.ProxyCreationEnabled = false;
base.Configuration.LazyLoadingEnabled = false;
En EF 6.1.3 puede obtener el tipo correcto usando
using (var context = new BloggingContext()) {
var blog = context.Blogs.Find(1);
var entityType = ObjectContext.GetObjectType(blog.GetType());
}
Tenga en cuenta que si el tipo pasado a GetObjectType es una instancia de un tipo de entidad que no es un tipo de proxy, entonces el tipo de entidad aún se devuelve. Esto significa que siempre puede usar este método para obtener el tipo de entidad real sin ninguna otra comprobación para ver si el tipo es un tipo de proxy o no.
Desde MSDN
Para desactivar la creación de proxy en Entity Framework 5 puede usar lo siguiente,
_dbContext.Configuration.ProxyCreationEnabled = false;
Simplemente establezca esta propiedad una vez antes de usar el contexto para extraer datos.
Puede establecer ObjectContext.ContextOptions.ProxyCreationEnabled
en false. Esto evitará que uses algunas de las funciones de fantasía de EF, como la carga lenta y creo que el seguimiento de cambios.
En lo que respecta a su aplicación, debería poder tratar los proxies como los tipos que representan. ¿Hay un problema específico que está teniendo?
Editar
Tenemos algún código que requiere el tipo de POCO en lugar del tipo de proxy y hacemos lo siguiente para detectar si el tipo actual es un proxy.
if (entityType.BaseType != null && entityType.Namespace == "System.Data.Entity.DynamicProxies")
{
entityType = entityType.BaseType;
}