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.