Учебники

Entity Framework — Типы

В Entity Framework есть два типа объектов, которые позволяют разработчикам использовать свои собственные пользовательские классы данных вместе с моделью данных, не внося никаких изменений в сами классы данных.

  • POCO лица
  • Динамический прокси

POCO Entities

  • POCO означает «старые» объекты CLR, которые можно использовать в качестве существующих объектов домена в вашей модели данных.

  • Классы данных POCO, которые отображаются на объекты, определяются в модели данных.

  • Он также поддерживает большинство тех же типов запросов, вставки, обновления и удаления, что и типы сущностей, которые генерируются инструментами модели данных сущностей.

  • Вы можете использовать шаблон POCO для генерации невосприимчивых типов сущностей из концептуальной модели.

POCO означает «старые» объекты CLR, которые можно использовать в качестве существующих объектов домена в вашей модели данных.

Классы данных POCO, которые отображаются на объекты, определяются в модели данных.

Он также поддерживает большинство тех же типов запросов, вставки, обновления и удаления, что и типы сущностей, которые генерируются инструментами модели данных сущностей.

Вы можете использовать шаблон POCO для генерации невосприимчивых типов сущностей из концептуальной модели.

Давайте посмотрим на следующий пример модели данных концептуальной сущности.

Концептуальная модель сущности

Чтобы сгенерировать сущности POCO для вышеуказанной модели Entity —

Шаг 1 — Щелкните правой кнопкой мыши в окне дизайнера. Появится следующий диалог.

Дизайнерское окно

Шаг 2 — Выберите пункт Добавить код генерации …

Генерация кода

Шаг 3 — Выберите EF 6.x DbContext Generator, написать имя , а затем нажмите кнопку Добавить.

В обозревателе решений вы увидите, что генерируются шаблоны POCODemo.Context.tt и POCODemo.tt.

Обозреватель решений

POCODemo.Context генерирует DbContext и наборы объектов, которые вы можете возвращать и использовать для запросов, скажем, для контекста, студентов и курсов и т. Д.

генерировать

Другой шаблон имеет дело со всеми типами Student, Courses и т. Д. Ниже приведен код для класса Student, который автоматически генерируется из Entity Model.

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

   }
}

Аналогичные классы создаются для таблиц курса и регистрации из модели сущностей.

Динамический прокси

При создании экземпляров типов сущностей POCO, Entity Framework часто создает экземпляры динамически генерируемого производного типа, который действует как прокси для сущности. Также можно сказать, что это прокси-классы времени выполнения, такие как класс-оболочка объекта POCO.

  • Вы можете переопределить некоторые свойства объекта для автоматического выполнения действий при обращении к свойству.

  • Этот механизм используется для поддержки отложенной загрузки отношений и автоматического отслеживания изменений.

  • Этот метод также применим к тем моделям, которые созданы с использованием Code First и EF Designer.

Вы можете переопределить некоторые свойства объекта для автоматического выполнения действий при обращении к свойству.

Этот механизм используется для поддержки отложенной загрузки отношений и автоматического отслеживания изменений.

Этот метод также применим к тем моделям, которые созданы с использованием Code First и EF Designer.

Если вы хотите, чтобы Entity Framework поддерживал отложенную загрузку связанных объектов и отслеживал изменения в классах POCO, то классы POCO должны соответствовать следующим требованиям:

  • Пользовательский класс данных должен быть объявлен с публичным доступом.

  • Пользовательский класс данных не должен быть запечатан.

  • Пользовательский класс данных не должен быть абстрактным.

  • Пользовательский класс данных должен иметь открытый или защищенный конструктор, который не имеет параметров.

  • Используйте защищенный конструктор без параметров, если вы хотите, чтобы метод CreateObject использовался для создания прокси для объекта POCO.

  • Вызов метода CreateObject не гарантирует создание прокси-сервера: класс POCO должен соответствовать другим требованиям, описанным в этом разделе.

  • Класс не может реализовать интерфейсы IEntityWithChangeTracker или IEntityWithRelationships, потому что прокси-классы реализуют эти интерфейсы.

  • Параметр ProxyCreationEnabled должен иметь значение true.

Пользовательский класс данных должен быть объявлен с публичным доступом.

Пользовательский класс данных не должен быть запечатан.

Пользовательский класс данных не должен быть абстрактным.

Пользовательский класс данных должен иметь открытый или защищенный конструктор, который не имеет параметров.

Используйте защищенный конструктор без параметров, если вы хотите, чтобы метод CreateObject использовался для создания прокси для объекта POCO.

Вызов метода CreateObject не гарантирует создание прокси-сервера: класс POCO должен соответствовать другим требованиям, описанным в этом разделе.

Класс не может реализовать интерфейсы IEntityWithChangeTracker или IEntityWithRelationships, потому что прокси-классы реализуют эти интерфейсы.

Параметр ProxyCreationEnabled должен иметь значение true.

В следующем примере показан класс динамического прокси-объекта.

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

Чтобы отключить создание прокси-объектов, установите для свойства ProxyCreationEnabled значение false.