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
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.
Colaborar conosco no GitHub
A fonte deste conteúdo pode ser encontrada no GitHub, onde você também pode criar e revisar problemas e solicitações de pull. Para obter mais informações, confira o nosso guia para colaboradores.
Comentários do .NET
O .NET é um projeto código aberto. Selecione um link para fornecer comentários:
Este módulo orienta você pelas etapas para criar um projeto de acesso a dados. Você se conecta a um banco de dados relacional e cria, lê, atualiza e exclui consultas (CRUD) usando o EF Core (Entity Framework Core).