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.