Entity Framework - DbContext

Entity Framework позволяет запрашивать, вставлять, обновлять и удалять данные с помощью объектов Common Language Runtime (CLR), известных как сущности. Entity Framework сопоставляет сущности и отношения, определенные в вашей модели, с базой данных. Он также предоставляет возможности для -

  • Материализовать данные, возвращаемые из базы данных, как объекты сущности
  • Отслеживайте изменения, внесенные в объекты
  • Обработка параллелизма
  • Распространение изменений объекта обратно в базу данных
  • Привязать объекты к элементам управления

Основным классом, отвечающим за взаимодействие с данными как объектами, является System.Data.Entity.DbContext. API DbContext не выпускается как часть .NET Framework. Чтобы быть более гибкими и частыми при выпуске новых функций для Code First и DbContext API, команда Entity Framework распространяет EntityFramework.dll через функцию распространения NuGet от Microsoft.

  • NuGet позволяет добавлять ссылки на проекты .NET, перетаскивая соответствующие библиотеки DLL непосредственно в проект из Интернета.

  • Расширение Visual Studio, называемое диспетчером пакетов библиотек, обеспечивает простой способ переноса соответствующей сборки из Интернета в ваши проекты.

  • API DbContext в основном нацелен на упрощение вашего взаимодействия с Entity Framework.

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

  • В предыдущих версиях Entity Framework эти задачи часто было сложно обнаружить и кодировать.

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

Определение производного класса DbContext

Рекомендуемый способ работы с контекстом - определить класс, производный от DbContext и предоставляющий свойства DbSet, представляющие коллекции указанных сущностей в контексте. Если вы работаете с EF Designer, контекст будет создан для вас. Если вы работаете с Code First, вы обычно сами пишете контекст.

Следующий код представляет собой простой пример, показывающий, что UniContext является производным от DbContext.

  • Вы можете использовать автоматические свойства с DbSet, такие как геттер и сеттер.

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

public class UniContext : DbContext {
   public UniContext() : base("UniContext") { }
   public DbSet<Student> Students { get; set; }
   public DbSet<Enrollment> Enrollments { get; set; }
   public DbSet<Course> Courses { get; set; }
}
  • Ранее EDM использовался для создания классов контекста, которые были производными от класса ObjectContext.

  • Работа с ObjectContext была немного сложной.

  • DbContext - это оболочка вокруг ObjectContext, которая на самом деле похожа на ObjectContext и полезна и проста во всех моделях разработки, таких как Code First, Model First и Database First.

Запросы

Вы можете использовать три типа запросов, например:

  • Добавление новой сущности.
  • Изменение или обновление значений свойств существующей сущности.
  • Удаление существующей сущности.

Добавление новых объектов

Добавить новый объект с помощью Entity Framework так же просто, как создать новый экземпляр вашего объекта и зарегистрировать его с помощью метода Add в DbSet. Следующий код предназначен для тех случаев, когда вы хотите добавить нового студента в базу данных.

private static void AddStudent() {

   using (var context = new UniContext()) {

      var student = new Student {
         LastName = "Khan", 
         FirstMidName = "Ali", 
         EnrollmentDate = DateTime.Parse("2005-09-01") 
      };

      context.Students.Add(student); 
      context.SaveChanges();

   }
}

Изменение существующих объектов

Изменить существующие объекты так же просто, как обновить значение, присвоенное свойствам, которые вы хотите изменить, и вызвать SaveChanges. В следующем коде фамилия Али была изменена с Хан на Аслам.

private static void AddStudent() {

   private static void ChangeStudent() {

      using (var context = new UniContext()) {

         var student = (from d in context.Students
            where d.FirstMidName == "Ali" select d).Single();
         student.LastName = "Aslam";
         context.SaveChanges();

      }
   }
}

Удаление существующих объектов

Чтобы удалить объект с помощью Entity Framework, вы используете метод Remove в DbSet. Удалить работает как для существующих, так и для вновь добавленных сущностей. Вызов Remove для объекта, который был добавлен, но еще не сохранен в базе данных, отменит добавление объекта. Сущность удаляется из средства отслеживания изменений и больше не отслеживается DbContext. Вызов Remove для существующей сущности, в которой отслеживаются изменения, зарегистрирует сущность для удаления при следующем вызове SaveChanges. В следующем примере показан случай, когда из базы данных удален ученик, имя которого Али.

private static void DeleteStudent() {

   using (var context = new UniContext()) {
      var bay = (from d in context.Students where d.FirstMidName == "Ali" select d).Single();
      context.Students.Remove(bay);
      context.SaveChanges();
   }
}