Вставка в базу данных
35LINQ --- LINQ to DataSet и SQL --- Вставка в базу данных
»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ
Для осуществления вставки необходимо выполнить четыре шага. Первый шаг — создание DataContext. Это первый шаг для любого запроса LINQ to SQL.
Второй шаг — создание экземпляра сущностного объекта из сущностного класса (такого как Customer).
Третий шаг — вставка этого сущностного объекта в соответствующую коллекцию таблицы типа Table<Т>, где T — тип сущностного класса, хранящегося в таблице, или добавление его к EntitySet<T> на сущностном объекте, уже отслеженном DataContext, где T — тип сущностного класса.
Четвертый и последний шаг — вызов метода SubmitChanges на объекте DataContext.
Ниже приведен пример вставки записи в базу данных (здесь для наглядности используется проект WPF и данные из таблицы Customers вставляются в элемент DataGrid, см. Исходный код):
// 1. Создание DataContext
// Используйте свою строку подключения
Northwind db = new Northwind(@"Data Source=MICROSOF-1EA29E\SQLEXPRESS;
AttachDbFilename=C:\Northwind.mdf;
Integrated Security=True");
// 2. Создание экземпляра сущностного объекта
Customer cust = new Customer
{
CustomerID = "ER85",
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
db.Customers.InsertOnSubmit(cust);
// 4. Вызов метода SubmitOnChanges
db.SubmitChanges();
Об этом примере говорить особо нечего. Во-первых, создается экземпляр объекта Northwind, чтобы иметь объект DataContext для базы данных Northwind. Во-вторых, создается экземпляр объекта Customer, который наполняется с использованием средства инициализации объектов. В-третьих, созданный экземпляр Customer вставляется в таблицу Customers типа Table<Customer>, в класс DataContext по имени Northwind. В-четвертых, вызывается метод SubmitChanges для сохранения вновь созданного объекта Customer в базе данных.
Так выглядит результат запуска этого кода:
Как видите, вставленная запись успешно найдена в базе данных. В качестве альтернативы для вставки записи в базу данных можно добавить новый экземпляр сущностного класса в уже существующий сущностный объект, отслеживаемый объектом DataContext:
// Используйте свою строку подключения
Northwind db = new Northwind(@"Data Source=MICROSOF-1EA29E\SQLEXPRESS;
AttachDbFilename=C:\Northwind.mdf;
Integrated Security=True");
Customer cust = (from c in db.Customers
where c.CustomerID == "LONEP"
select c).Single<Customer>();
// Используется для запроса записи
DateTime now = DateTime.Now;
Order order = new Order
{
CustomerID = cust.CustomerID,
EmployeeID = 4,
OrderDate = now,
RequiredDate = DateTime.Now.AddDays(7),
ShipVia = 3,
Freight = new Decimal(24.66),
ShipName = cust.CompanyName,
ShipAddress = cust.Address,
ShipCity = cust.City,
ShipRegion = cust.Region,
ShipPostalCode = cust.PostalCode,
ShipCountry = cust.Country
};
cust.Orders.Add(order);
db.SubmitChanges();
IEnumerable<Order> orders =
db.Orders.Where(o => o.CustomerID == "LONEP" && o.OrderDate.Value == now);
foreach (Order o in orders)
{
MessageBox.Show(o.OrderDate + " " + o.ShipName);
}
В этом примере создается объект DataContext по имени Northwind, извлекается заказчик и добавляется вновь сконструированный сущностный объект к свойству Orders типа EntitySet<Order> сущностного объекта Customer. Затем новая запись запрашивается и выводится на консоль.
В первом примере вставляемый объект, которым был Customer, добавлялся в переменную типа Table<Customer>. Во втором примере вставляемый объект, которым является Order, добавляется в переменную типа EntitySet<Order>. Ниже показан результат выполнения кода из листинга:
Вставка присоединенных сущностных объектов
Класс DataContext обнаруживает любые зависимые ассоциированные объекты сущностных классов, которые присоединены к данному объекту, так что они также сохраняются при вызове метода SubmitChanges. Под зависимыми подразумеваются объекты сущностных классов, содержащие внешний ключ, который указывает на вставляемый объект сущностного класса:
...
Customer cust = new Customer
{
CustomerID = "ER85",
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 = "ER85",
EmployeeID = 4,
OrderDate = now,
RequiredDate = DateTime.Now.AddDays(7),
ShipVia = 3,
Freight = new Decimal(24.66),
ShipName = "ProfessorWeb",
ShipAddress = "1017 Maple Leaf",
ShipCity = "Moscow",
ShipRegion = "MC",
ShipPostalCode = "555555",
ShipCountry = "Russia"
}
}
};
db.Customers.InsertOnSubmit(cust);
db.SubmitChanges();
В данном коде создается новый объект Customer с присоединенной к нему коллекцией Orders, содержащей один вновь созданный экземпляр Order. Несмотря на то что вставляется только объект cust типа Customer в таблицу Customers, а заказы явно не вставляются в таблицу Orders, при вызове метода SubmitChanges этот новый Order также будет сохранен в базе данных, поскольку новый Order присоединен к новому Customer.