Обновление базы данных
99LINQ --- LINQ to Entities --- Обновление базы данных
»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ
Обновления сущностных типов заключаются в простом изменении свойств сущностного объекта, вызове метода 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 позаботится об управлении изменениями в связанных данных на основе ассоциаций в сущностных объектах.