Вставка в базу данных

35

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

Для осуществления вставки необходимо выполнить четыре шага. Первый шаг — создание 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 в базе данных.

Так выглядит результат запуска этого кода:

Вставка записи посредством вставки сущностного объекта в Таble<Т>

Как видите, вставленная запись успешно найдена в базе данных. В качестве альтернативы для вставки записи в базу данных можно добавить новый экземпляр сущностного класса в уже существующий сущностный объект, отслеживаемый объектом 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>. Ниже показан результат выполнения кода из листинга:

Вставка записи в базу данных Nothwind добавлением к EntitySet<T>

Вставка присоединенных сущностных объектов

Класс 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.

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