Учебники

Entity Framework – отключенные объекты

В этой главе давайте рассмотрим, как вносить изменения в сущности, которые не отслеживаются контекстом. Объекты, которые не отслеживаются контекстом, называются «отключенными» объектами.

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

  • Операции над отключенными объектами гораздо чаще встречаются в приложениях N-уровня.

  • Приложения N-уровня включают получение некоторых данных на сервере и их передачу по сети на клиентский компьютер.

  • Затем клиентское приложение манипулирует этими данными, прежде чем вернуть их на сервер для сохранения.

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

Операции над отключенными объектами гораздо чаще встречаются в приложениях N-уровня.

Приложения N-уровня включают получение некоторых данных на сервере и их передачу по сети на клиентский компьютер.

Затем клиентское приложение манипулирует этими данными, прежде чем вернуть их на сервер для сохранения.

Ниже приведены два шага, которые необходимо выполнить с графом отключенного объекта или даже с одним отключенным объектом.

  • Присоедините сущности с новым экземпляром контекста и сделайте контекст осведомленным об этих сущностях.

  • Установите соответствующие EntityStates для этих объектов вручную.

Присоедините сущности с новым экземпляром контекста и сделайте контекст осведомленным об этих сущностях.

Установите соответствующие EntityStates для этих объектов вручную.

Изменить на сущность

Давайте посмотрим на следующий код, в котором сущность Student добавляется с двумя сущностями Enrollment.

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram", 

         EnrollmentDate = DateTime.Parse("2015-10-10"), 
            Enrollments = new List<Enrollment> {

               new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 },
               new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 },
         }
      };

      using (var context = new UniContextEntities()) {

         context.Students.Add(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", 
               enrollment.EnrollmentID, context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   } 
}
  • Код создает новый экземпляр Student, который также ссылается на два новых экземпляра Enrollment в своем свойстве Enrollments.

  • Затем новый студент добавляется в контекст с помощью метода Add.

  • После добавления ученика код использует метод DbContext.Entry, чтобы получить доступ к информации об отслеживании изменений, которую Entity Framework имеет о новом ученике.

  • Из этой информации отслеживания изменений свойство State используется для записи текущего состояния объекта.

  • Затем этот процесс повторяется для каждой из вновь созданных заявок, на которые ссылается новый студент. Если вы запустите приложение, вы получите следующий вывод:

Код создает новый экземпляр Student, который также ссылается на два новых экземпляра Enrollment в своем свойстве Enrollments.

Затем новый студент добавляется в контекст с помощью метода Add.

После добавления ученика код использует метод DbContext.Entry, чтобы получить доступ к информации об отслеживании изменений, которую Entity Framework имеет о новом ученике.

Из этой информации отслеживания изменений свойство State используется для записи текущего состояния объекта.

Затем этот процесс повторяется для каждой из вновь созданных заявок, на которые ссылается новый студент. Если вы запустите приложение, вы получите следующий вывод:

New Student   (Wasim  Akram): Added
Enrollment ID: 2001 State: Added
Enrollment ID: 2002 State: Added
Press any key to exit...

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

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

class Program {

   static void Main(string[] args) {

      var student = new Student {

         ID = 1001,
         FirstMidName = "Wasim",
         LastName = "Akram",
         EnrollmentDate = DateTime.Parse("2015-10-10"), 

         Enrollments = new List<Enrollment> {
            new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 },
            new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 },
         }
			
      };

      using (var context = new UniContextEntities()) {

         context.Students.Attach(student);
         Console.WriteLine("New Student ({0} {1}): {2}", 
            student.FirstMidName, student.LastName, context.Entry(student).State);

         foreach (var enrollment in student.Enrollments) {
            Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID, 
               context.Entry(enrollment).State);
         }

         Console.WriteLine("Press any key to exit...");
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код выполняется с помощью метода Attach (), вы получите следующий вывод.