Вставка в базу данных
35LINQ --- LINQ to Entities --- Вставка в базу данных
»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ
Для выполнения вставки необходимо предпринять четыре шага. Первый из них — создание ObjectContext. Это первый шаг для всех операций LINQ to Entities, и он встречается во всех примерах. Получив объектный контекст, можно создать новый экземпляр сущностного типа, например, Customer, и наполнить данными его поля. Заполненный сущностный тип затем добавляется к ObjectSet<T>. Последний шаг — сохранение новых данных посредством метода SaveChanges:
// 1. Создание ObjectContext
NorthwindEntities context = new NorthwindEntities();
// 2. Создание экземпляра сущностного объекта
Customer cust = new Customer
{
CustomerID = "ERH85",
CompanyName = "ProfessorWeb",
ContactName = "Александр Ерохин",
ContactTitle = "Owner",
Address = "1017 Maple Leaf",
City = "Moscow",
Region = "MC",
PostalCode = "555555",
Country = "Russia",
Phone = "+7(800)123-4567",
Fax = "None"
};
// 3. Добавление сущностного объекта в таблицу Customers
context.Customers.AddObject(cust);
// 4. Вызов метода SaveChanges
context.SaveChanges();
// Проверяем наличие вставленной записи
Customer getcust = (from c in context.Customers
where c.CustomerID == "ERH85"
select c).SingleOrDefault<Customer>();
Console.WriteLine("\n Новый заказчик {0} вставлен в базу данных",
getcust == null ? "не" : "успешно");
Как видите, в предыдущем коде шаги пронумерованы. На первом шаге строится ObjectContext за счет создания нового экземпляра производного класса NorthwindEntities. На втором шаге создается новый экземпляр сущностного типа Customer и применяется инициализация объекта для заполнения полей. На третьем шаге в коллекцию Customers добавляется новый экземпляр Customer вызовом метода AddObject свойства Customers объекта ObjectContext. Это свойство в базе данных имеет тип ObjectSet<Customer>. На последнем шаге вызывается метод SaveChanges для сохранения новой записи в базе данных.
В оставшейся части кода данные запрашиваются, чтобы убедиться, что новая запись была создана.
Создание частично заполненных сущностных типов
В предыдущем коде явно создается новый сущностный тип, но при этом используется другой подход. Сущностные типы Entity Framework включают статический метод по имени Create[T], где [T] — имя типа. Например, сущностный тип Customer будет включать метод под названием CreateCustomer, а тип Order — метод по имени CreateOrder. Эти методы имеют параметры для каждого поля сущностного типа, которое не допускает значения null. На рисунке ниже показана таблица Customers базы Northwind в среде SQL Server Management Studio. Здесь видно, что все столбцы могут содержать значения null, за исключением CustomerID и CompanyName:
Таким образом, статический метод Customer.CreateCustomer имеет следующую сигнатуру, которая требует параметров для поля с обязательным заполнением:
public static Customer CreateCustomer(
String customerID, String companyName);
Преимущество использования метода Create[T] состоит в том, что он позволяет избежать исключений при попытке сохранить сущностный тип со значением null в не допускающем null поле. Ниже приведен код создания и добавления записи посредством этого приема:
// Создание ObjectContext
NorthwindEntities context = new NorthwindEntities();
// Создание экземпляра сущностного объекта
Customer cust = Customer.CreateCustomer("ERH85", "ProfessorWeb");
cust.ContactName = "Александр Ерохин";
cust.ContactTitle = "Owner";
cust.Address = "1017 Maple Leaf";
cust.City = "Moscow";
cust.Region = "MC";
cust.PostalCode = "555555";
cust.Country = "Russia";
cust.Phone = "+7(800)123-4567";
cust.Fax = "None";
// Добавление сущностного объекта в таблицу Customers
context.Customers.AddObject(cust);
// Вызов метода SaveChanges
context.SaveChanges();
// Проверяем наличие вставленной записи
Customer getcust = (from c in context.Customers
where c.CustomerID == "ERH85"
select c).SingleOrDefault<Customer>();
Console.WriteLine("\n Новый заказчик {0} вставлен в базу данных",
getcust == null ? "не" : "успешно");
Как видите, здесь был создан новый экземпляр Customer с использованием метода CreateCustomer, которому переданы значения двух полей, не допускающие null. Затем с помощью общедоступных свойств типа Customer устанавливаются другие необходимые значения.
Вставка присоединенных сущностных объектов
Класс ObjectContext обнаруживает присоединения между сущностными объектами и гарантирует их автоматическое сохранение в базе данных с помощью метода SaveChanges. Помните, что сущностные объекты присоединяются тогда, когда между ними существует отношение внешнего ключа. В следующем пример показано, как это работает:
// Создание ObjectContext
NorthwindEntities context = new NorthwindEntities();
// Создание экземпляра сущностного объекта
Customer cust = new Customer
{
CustomerID = "ERH85",
CompanyName = "ProfessorWeb",
ContactName = "Александр Ерохин",
ContactTitle = "Owner",
Address = "1017 Maple Leaf",
City = "Moscow",
Region = "MC",
PostalCode = "555555",
Country = "Russia",
Phone = "+7(800)123-4567",
Fax = "None",
Orders = {
new Order {
CustomerID = "ERH85",
EmployeeID = 4,
OrderDate = DateTime.Now,
RequiredDate = DateTime.Now.AddDays(7),
ShipVia = 3,
Freight = new Decimal(24.66),
ShipName = "Lawn Wranglers",
ShipAddress = "1017 Maple Leaf Way",
ShipCity = "Ft. Worth",
ShipRegion = "TX",
ShipPostalCode = "76104",
ShipCountry = "USA"
}
}
};
// Добавление сущностного объекта в таблицу Customers
context.Customers.AddObject(cust);
// Сохранить изменения
context.SaveChanges();
// Проверяем наличие вставленной записи
Customer getcust = (from c in context.Customers
where c.CustomerID == "ERH85"
select c).SingleOrDefault<Customer>();
foreach (Order o in getcust.Orders)
Console.WriteLine("\n {0} - {1} ", o.CustomerID, o.OrderDate);
В этом примере создается новый объект Customer, а свойство-коллекция Orders инициализируется единственным новым заказом. При вызове метода SaveChanges объект ObjectContext сохраняет и Customers, и Orders. Явно добавлять Order в коллекцию Orders типа ObjectSet не понадобится.
Создавать присоединенные объекты вместе подобным образом не обязательно. Их можно создавать отдельно и затем ассоциировать друг с другом. Ниже показана видоизмененная часть предыдущего примера:
...
// Создание объекта Customer
Customer cust = new Customer
{
CustomerID = "ERH85",
CompanyName = "ProfessorWeb",
ContactName = "Александр Ерохин",
ContactTitle = "Owner",
Address = "1017 Maple Leaf",
City = "Moscow",
Region = "MC",
PostalCode = "555555",
Country = "Russia",
Phone = "+7(800)123-4567",
Fax = "None"
};
// Создание объекта Order
Order order = new Order {
CustomerID = "ERH85",
EmployeeID = 4,
OrderDate = DateTime.Now,
RequiredDate = DateTime.Now.AddDays(7),
ShipVia = 3,
Freight = new Decimal(24.66),
ShipName = "Lawn Wranglers",
ShipAddress = "1017 Maple Leaf Way",
ShipCity = "Ft. Worth",
ShipRegion = "TX",
ShipPostalCode = "76104",
ShipCountry = "USA"
};
// Присоединить Order к Customer
cust.Orders.Add(order);
...
В коде объекты Customer и Order создавались отдельно и затем были присоединены друг к другу вызовом метода Orders.Add, который поместил Order в коллекцию ObjectSet<Qrder>, поддерживаемую Customer. При вызове метода SaveChanges объект ObjectContext обнаруживает новый Order и сохраняет его в базе данных.
Знайте, что лучший способ присоединять объекты в отношении "один ко многим" предусматривает добавление их к соответствующему ObjectSet на стороне родительского объекта в отношении.