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.