Entity Framework - Tipos
No Entity Framework, existem dois tipos de entidades que permitem aos desenvolvedores usar suas próprias classes de dados personalizadas junto com o modelo de dados, sem fazer nenhuma modificação nas próprias classes de dados.
- Entidades POCO
- Proxy Dinâmico
Entidades POCO
POCO significa objetos CLR "simples" que podem ser usados como objetos de domínio existentes com seu modelo de dados.
As classes de dados POCO que são mapeadas para entidades são definidas em um modelo de dados.
Ele também suporta a maioria dos mesmos comportamentos de consulta, inserção, atualização e exclusão como tipos de entidade que são gerados pelas ferramentas de Modelo de Dados de Entidade.
Você pode usar o modelo POCO para gerar tipos de entidade ignorantes de persistência a partir de um modelo conceitual.
Vamos dar uma olhada no seguinte exemplo de Modelo de Dados de Entidade Conceitual.
Para gerar entidades POCO para o modelo de entidade acima -
Step 1- Clique com o botão direito na janela do designer. Ele exibirá a seguinte caixa de diálogo.
Step 2 - Selecione Adicionar Item de Geração de Código ...
Step 3 - Selecione o Gerador EF 6.x DbContext, escreva o nome e clique no botão Adicionar.
Você verá em seu explorador de soluções que os modelos POCODemo.Context.tt e POCODemo.tt são gerados.
O POCODemo.Context gera o DbContext e os conjuntos de objetos que você pode retornar e usar para consultar, digamos, para contexto, Alunos e Cursos, etc.
O outro modelo lida com todos os tipos Aluno, Cursos, etc. A seguir está o código para a classe Aluno que é gerado automaticamente a partir do Modelo de Entidade.
namespace ConsoleApplication1 {
using System;
using System.Collections.Generic;
public partial class Student {
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2214:DoNotCallOverridableMethodsInConstructors")]
public Student() {
this.Enrollments = new HashSet<Enrollment>();
}
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public System.DateTime EnrollmentDate { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}
Classes semelhantes são geradas para as tabelas de Curso e Matrícula do Modelo de Entidade.
Proxy Dinâmico
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. Também se pode dizer que é uma classe de proxy de tempo de execução como uma classe wrapper da entidade POCO.
Você pode substituir algumas propriedades da entidade para executar ações automaticamente quando a propriedade é acessada.
Este mecanismo é usado para suportar o carregamento lento de relacionamentos e rastreamento automático de alterações.
Esta técnica também se aplica aos modelos criados com Code First e EF Designer.
Se você deseja que o Entity Framework ofereça suporte ao carregamento lento dos objetos relacionados e rastreie as alterações nas classes POCO, as classes POCO devem atender aos seguintes requisitos -
A classe de dados personalizados deve ser declarada com acesso público.
A classe de dados personalizados não deve ser lacrada.
A classe de dados personalizados não deve ser abstrata.
A classe de dados personalizados deve ter um construtor público ou protegido que não tenha parâmetros.
Use um construtor protegido sem parâmetros se desejar que o método CreateObject seja usado para criar um proxy para a entidade POCO.
Chamar o método CreateObject não garante a criação do proxy: a classe POCO deve seguir os outros requisitos descritos neste tópico.
A classe não pode implementar as interfaces IEntityWithChangeTracker ou IEntityWithRelationships porque as classes de proxy implementam essas interfaces.
A opção ProxyCreationEnabled deve ser definida como true.
O exemplo a seguir é de classe de entidade de proxy dinâmico.
public partial class Course {
public Course() {
this.Enrollments = new HashSet<Enrollment>();
}
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
Para desativar a criação de objetos proxy, defina o valor da propriedade ProxyCreationEnabled como false.