Trabajar con servidores proxy
Al crear instancias de tipos de entidad POCO, Entity Framework a menudo crea instancias de un tipo derivado generado dinámicamente que actúa como proxy para la entidad. Este proxy invalida algunas propiedades virtuales de la entidad para insertar enlaces para realizar acciones automáticamente cuando se accede a la propiedad. Por ejemplo, este mecanismo se usa para admitir la carga diferida de relaciones. Las técnicas que se muestran en este tema se aplican igualmente a los modelos creados con Code First y EF Designer.
Deshabilitación de la creación de proxy
A veces resulta útil evitar que Entity Framework cree instancias de proxy. Por ejemplo, la serialización de instancias que no son de proxy es considerablemente más fácil que serializar instancias de proxy. La creación del proxy se puede desactivar desactivando la marca ProxyCreationEnabled
. Un lugar en el que podría hacerlo es en el constructor del contexto. Por ejemplo:
public class BloggingContext : DbContext
{
public BloggingContext()
{
this.Configuration.ProxyCreationEnabled = false;
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
Tenga en cuenta que EF no creará servidores proxy para los tipos en los que no hay nada que hacer para el proxy. Esto significa que también puede evitar servidores proxy si tiene tipos sellados y/o que no tienen propiedades virtuales.
Creación explícita de una instancia de un proxy
No se creará una instancia de proxy si crea una instancia de una entidad mediante el operador nuevo. Esto puede no ser un problema, pero si necesita crear una instancia de proxy (por ejemplo, para que funcione la carga diferida o el seguimiento de cambios de proxy), puede hacerlo mediante el método Create
de DbSet
. Por ejemplo:
using (var context = new BloggingContext())
{
var blog = context.Blogs.Create();
}
La versión genérica de Create
se puede usar si desea crear una instancia de un tipo de entidad derivada. Por ejemplo:
using (var context = new BloggingContext())
{
var admin = context.Users.Create<Administrator>();
}
Tenga en cuenta que el método Create
no agrega ni asocia la entidad creada al contexto.
Tenga en cuenta que el método Create
simplemente crea una instancia del propio tipo de entidad si la creación de un tipo de proxy para la entidad no tuviera ningún valor porque no haría nada. Por ejemplo, si el tipo de entidad está sellado o no tiene ninguna propiedad virtual, Create
simplemente creará una instancia del tipo de entidad.
Obtención del tipo de entidad real de un tipo de proxy
Los tipos de proxy tienen nombres que tienen un aspecto similar al siguiente:
System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6
Puede encontrar el tipo de entidad para este tipo de proxy mediante el método GetObjectType
de ObjectContext
. Por ejemplo:
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, se sigue devolviendo el tipo de entidad. 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.