Compartilhar via


Trabalhando com proxies

Ao criar instâncias de tipos de entidade POCO, o Entity Framework geralmente cria instâncias de um tipo derivado gerado dinamicamente que atua como um proxy para a entidade. Esse proxy substitui algumas propriedades virtuais da entidade para inserir ganchos para executar ações automaticamente quando a propriedade é acessada. Por exemplo, esse mecanismo é usado para suportar o carregamento lento de relacionamentos. As técnicas mostradas neste tópico se aplicam igualmente a modelos criados com o Code First e com o EF Designer.

Desabilitando a criação de proxy

Às vezes, é útil impedir que o Entity Framework crie instâncias de proxy. Por exemplo, serializar instâncias não proxy é consideravelmente mais fácil do que serializar instâncias de proxy. A criação de proxy pode ser desativada limpando o sinalizador ProxyCreationEnabled. Um lugar que você poderia fazer isso é no construtor do seu contexto. Por exemplo:

public class BloggingContext : DbContext
{
    public BloggingContext()
    {
        this.Configuration.ProxyCreationEnabled = false;
    }  

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

Observe que o EF não criará proxies para tipos onde não há nada para o proxy fazer. Isso significa que você também pode evitar proxies por ter tipos que são lacrados e/ou não têm propriedades virtuais.

Criando explicitamente uma instância de um proxy

Uma instância de proxy não será criada se você criar uma instância de uma entidade usando o novo operador. Isso pode não ser um problema, mas se você precisar criar uma instância de proxy (por exemplo, para que o carregamento lento ou o controle de alterações de proxy funcione), poderá fazê-lo usando o método Create de DbSet. Por exemplo:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Create();
}

A versão genérica do Create pode ser usada se você quiser criar uma instância de um tipo de entidade derivada. Por exemplo:

using (var context = new BloggingContext())
{
    var admin = context.Users.Create<Administrator>();
}

Observe que o método Create não adiciona ou anexa a entidade criada ao contexto.

Observe que o método Create apenas criará uma instância do próprio tipo de entidade se a criação de um tipo de proxy para a entidade não tiver valor porque não faria nada. Por exemplo, se o tipo de entidade estiver lacrado e/ou não tiver propriedades virtuais, Create criará apenas uma instância do tipo de entidade.

Obtendo o tipo de entidade real de um tipo de proxy

Os tipos de proxy têm nomes semelhantes a esse:

System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

Você pode encontrar o tipo de entidade para esse tipo de proxy usando o método GetObjectType de ObjectContext. Por exemplo:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);
    var entityType = ObjectContext.GetObjectType(blog.GetType());
}

Observe que se o tipo passado para GetObjectType for uma instância de um tipo de entidade que não seja um tipo de proxy, o tipo de entidade ainda será retornado. Isso significa que você sempre pode usar esse método para obter o tipo de entidade real sem qualquer outra verificação para ver se o tipo é um tipo de proxy ou não.