Обновление базы данных

99

»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ

Обновления сущностных типов заключаются в простом изменении свойств сущностного объекта, вызове метода SaveChanges объекта ObjectContext с разрешением конфликтов параллельного доступа, если это необходимо. Разрешение этих конфликтов в Entity Framework рассматривается далее позже. В следующем коде приведен простой пример обновления:

// Создание ObjectContext
            NorthwindEntities context = new NorthwindEntities();

            // Получить заказчика LAZYK
            Customer cust = (from c in context.Customers
                             where c.CustomerID == "LAZYK"
                             select c).Single<Customer>();

            // Изменить его имя
            cust.ContactName = "Ned Plimpton";

            // Сохранить изменения
            context.SaveChanges();

            // Восстановить базу данных
            cust.ContactName = "John Steel";
            context.SaveChanges();

В этом коде выполняется запрос для нахождения Customer со значением CustomerID, равным LAZYK. Затем его значение ContactName изменяется на Ned Plimpton. После этого вызывается метод SaveChanges для сохранения изменений в базе данных. Для восстановления базы данных значение ContactName изменяется обратно на John Steel и вызывается SaveChanges опять, сохраняя базу данных в исходном виде.

Обновление ассоциированных объектов

Entity Framework заботится об управлении отношениями между ассоциированными типами данных. Вы просто должны внести нужные изменения и вызвать метод SaveChanges. Пример приведен ниже:

// Создание ObjectContext
            NorthwindEntities context = new NorthwindEntities();

            Order order = (from o in context.Orders
                           where o.EmployeeID == 5
                           orderby o.OrderDate descending
                           select o).First<Order>();

            // Сохранить текущего сотрудника, чтобы можно было восстановить его в конце.
            Employee origEmployee = order.Employee;

            Console.WriteLine("Перед изменением сотрудника.");
            Console.WriteLine("OrderID = {0} : OrderDate = {1} : EmployeeID = {2}",
              order.OrderID, order.OrderDate, order.Employee.EmployeeID);

            Employee emp = (from e in context.Employees
                            where e.EmployeeID == 9
                            select e).Single<Employee>();

            //  Назначить нового сотрудника на заказ.
            order.Employee = emp;

            context.SaveChanges();

            Order order2 = (from o in emp.Orders
                            where o.OrderID == order.OrderID
                            select o).First<Order>();

            Console.WriteLine("\nПосле изменения сотрудника.");
            Console.WriteLine("OrderID = {0} : OrderDate = {1} : EmployeeID = {2}",
              order2.OrderID, order2.OrderDate, order2.Employee.EmployeeID);

            // Теперь необходимо отменить изменения, чтобы можно было пример запускать многократно.
            order.Employee = origEmployee;
            context.SaveChanges();

В этом коде содержится тот же пример, что использовался для демонстрации обновлений ассоциированных классов в LINQ to SQL, но код изменен для работы с LINQ to Entities. Здесь запрашивается Order и обновляется его отношение с типом Employee, после чего база данных восстанавливается в исходном состоянии. Как и LINQ to SQL, LINQ to Entities позаботится об управлении изменениями в связанных данных на основе ассоциаций в сущностных объектах.

Обновление отношения ассоциированных типов
Пройди тесты
Лучший чат для C# программистов