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

35

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

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

Таблица Customers базы данных Northwind

Таким образом, статический метод 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);
Создание сущностного типа методом Create[Т]

В этом примере создается новый объект 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 на стороне родительского объекта в отношении.

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