Entity Framework: tipos

En Entity Framework, hay dos tipos de entidades que permiten a los desarrolladores usar sus propias clases de datos personalizadas junto con el modelo de datos sin realizar modificaciones en las clases de datos.

  • Entidades POCO
  • Proxy dinámico

Entidades POCO

  • POCO significa objetos CLR "simples" que se pueden usar como objetos de dominio existentes con su modelo de datos.

  • Las clases de datos de POCO que se asignan a entidades se definen en un modelo de datos.

  • También admite la mayoría de los mismos comportamientos de consulta, inserción, actualización y eliminación que los tipos de entidad generados por las herramientas de Entity Data Model.

  • Puede utilizar la plantilla POCO para generar tipos de entidad que ignoran la persistencia a partir de un modelo conceptual.

Echemos un vistazo al siguiente ejemplo de modelo de datos de entidad conceptual.

Para generar entidades POCO para el modelo de entidad anterior:

Step 1- Haga clic derecho en la ventana del diseñador. Mostrará el siguiente diálogo.

Step 2 - Seleccione el elemento Agregar generación de código ...

Step 3 - Seleccione EF 6.x DbContext Generator, escriba el nombre y luego haga clic en el botón Agregar.

Verá en su explorador de soluciones que se generan las plantillas POCODemo.Context.tt y POCODemo.tt.

El POCODemo.Context genera el DbContext y los conjuntos de objetos que puede devolver y usar para realizar consultas, por ejemplo, para el contexto, estudiantes y cursos, etc.

La otra plantilla se ocupa de todos los tipos Alumno, Cursos, etc. A continuación se muestra el código de la clase Alumno que se genera automáticamente a partir del Modelo de entidad.

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; }

   }
}

Se generan clases similares para las tablas de cursos e inscripción desde el modelo de entidad.

Proxy dinámico

Al crear instancias de tipos de entidad POCO, Entity Framework a menudo crea instancias de un tipo derivado generado dinámicamente que actúa como un proxy para la entidad. También se puede decir que es una clase de proxy en tiempo de ejecución como una clase contenedora de entidad POCO.

  • Puede anular algunas propiedades de la entidad para realizar acciones automáticamente cuando se accede a la propiedad.

  • Este mecanismo se utiliza para admitir la carga diferida de relaciones y el seguimiento automático de cambios.

  • Esta técnica también se aplica a los modelos que se crean con Code First y EF Designer.

Si desea que Entity Framework admita la carga diferida de los objetos relacionados y realice un seguimiento de los cambios en las clases de POCO, las clases de POCO deben cumplir con los siguientes requisitos:

  • La clase de datos personalizada debe declararse con acceso público.

  • La clase de datos personalizada no debe sellarse.

  • La clase de datos personalizada no debe ser abstracta.

  • La clase de datos personalizada debe tener un constructor público o protegido que no tenga parámetros.

  • Use un constructor protegido sin parámetros si desea que el método CreateObject se use para crear un proxy para la entidad POCO.

  • Llamar al método CreateObject no garantiza la creación del proxy: la clase POCO debe seguir los demás requisitos que se describen en este tema.

  • La clase no puede implementar las interfaces IEntityWithChangeTracker o IEntityWithRelationships porque las clases de proxy implementan estas interfaces.

  • La opción ProxyCreationEnabled debe establecerse en true.

El siguiente ejemplo es de una clase de entidad proxy dinámica.

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 deshabilitar la creación de objetos proxy, establezca el valor de la propiedad ProxyCreationEnabled en falso.