Entity Framework - постоянство

Entity Framework теперь позволяет вам использовать Entity Framework, не заставляя каждую часть вашего приложения знать о Entity Framework, отделяя сущности от инфраструктуры. Вы можете создавать классы, которые могут сосредоточиться на своих бизнес-правилах, независимо от того, как они сохраняются (где хранятся данные и как данные передаются между вашими объектами).

Создание стойких невежественных сущностей

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

  • В версии Entity Framework для .NET 3.5, если вы хотели использовать уже существующие классы, вам нужно было изменить их, заставив наследовать их от EntityObject.

  • В .NET 4 это больше не нужно. Вам не нужно изменять свои сущности, чтобы они могли участвовать в операциях Entity Framework.

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

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

Есть 2 способа (подключенный и отключенный) при сохранении сущности с помощью Entity Framework. Оба пути имеют собственное значение. В случае подключенного сценария изменения отслеживаются контекстом, но в случае отключенного сценария нам необходимо сообщить контексту о состоянии объекта.

Связанные сценарии

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

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

class Program {

   static void Main(string[] args) {

      using (var context = new MyContext()) {

         var studentList = context.Students.ToList();

         foreach (var stdnt in studentList) {
            stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
         }

         context.SaveChanges();

         //// Display all Students from the database

         var students = (from s in context.Students
            orderby s.FirstMidName select s).ToList<Student>();

         Console.WriteLine("Retrieve all Students from the database:");

         foreach (var stdnt in students) {
            string name = stdnt.FirstMidName + " " + stdnt.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
         }

         Console.ReadKey();
      }
   }
}

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

Retrieve all Students from the database: 
ID: 1, Name: Edited Edited Alain Bomer 
ID: 2, Name: Edited Edited Mark Upston

Отключенные сценарии

Сценарий отключения - это когда объект извлекается из базы данных и изменяется в другом контексте. Предположим, мы хотим отобразить некоторые данные на уровне представления и используем какое-то n-уровневое приложение, поэтому было бы лучше открыть контекст, получить данные и, наконец, закрыть контекст. Поскольку здесь мы извлекли данные и закрыли контекст, извлеченные нами объекты больше не отслеживаются, и это сценарий отключения.

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

class Program {

   static void Main(string[] args) {

      var student = new Student {
         ID = 1001, 
         FirstMidName = "Wasim", 
         LastName = "Akram", 
         EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
      };

      using (var context = new MyContext()) {

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

         //// Display all Students from the database

         var students = (from s in context.Students 
            orderby s.FirstMidName select s).ToList<Student>();

         Console.WriteLine("Retrieve all Students from the database:");

         foreach (var stdnt in students) {
            string name = stdnt.FirstMidName + " " + stdnt.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
         }

         Console.ReadKey();
      }
   }
}

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

Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram