Поделиться через


Код приложения с использованием ассоциаций (модель EDM)

Модель объектов, сконструированную в модели Entity Data Model (модель EDM) в разделе Реализация ассоциаций (модель EDM), можно использовать в клиентских приложениях. Приложения модели EDM могут создавать экземпляры, запросы и сохранять данные без инструкций SQL. Дополнительные сведения см. в разделе Общие сведения о службах объектов (платформа Entity Framework).

Код приложения, приведенный в разделе, показывает, как создать экземпляры ассоциаций сущностей с именами Customers и Orders и перемещаться по ассоциациям между сущностями Customers и Orders и между Orders и OrderLines.

Создание и инициализация сущностей

В следующем фрагменте кода показано, как создать один экземпляр каждого из трех типов: Customers, Orders и OrderLines. Экземпляр соединения с пространством имен OrderInfo создается одной строкой кода: OrderInfo orderInfo = new OrderInfo().

Сущности являются программируемыми классами, поэтому они создаются с помощью конструктора, предоставленного при построении библиотеки класса. Добавьте эти сущности в контекст объекта с помощью метода AddToOrderInfo контекста OrderInfoObjectContext. Дополнительные сведения см. в разделе Добавление, изменение и удаление объектов (платформа Entity Framework).

В следующем фрагменте кода создаются экземпляры Customer, Order и OrderLine. В этом коде создаются также экземпляры ассоциаций между сущностями Customer и Order, а также между сущностями Order и OrderLine.

После инициализации объектов в следующем коде они добавляются в хранилище и изменения сохраняются.

                    Dim i As Integer = 0
                    Dim newCustomer As Customers = _
                    New Customers()
                    newCustomer.CustomerId = _
                                    Guid.NewGuid()
                    newCustomer.Name = "Customer-" + _
                                    i.ToString()
                    newCustomer.Address = "Address-" + _
                                    i.ToString()
                    newCustomer.City = "Redmond"
                    newCustomer.Phone = "123 456-7890"
                    newCustomer.ZipCode = 98054

                    Dim newOrder As New Orders()
                    newOrder.OrderId = i.ToString()
                    newOrder.Customers = newCustomer
                    newOrder.ShippingAddress = _
                                "Address-" + i.ToString()
                    newOrder.Tax = 0
                    newOrder.TotalAmount = 0

                    Dim newOrderLines As OrderLines = New OrderLines()
                    newOrderLines.OrderLineId = Guid.NewGuid()
                    newOrderLines.ProductName = "Product-" + _
                    i.ToString()
                    newOrderLines.Quantity = 2
                    newOrderLines.UnitPrice = 67.71
                    newOrderLines.ExtendedPrice = _
                        newOrderLines.Quantity * _
                        newOrderLines.UnitPrice

                    newOrder.OrderLines.Add(newOrderLines)

                    orderInfo.AddToCustomers(newCustomer)
                    orderInfo.AddToOrders(newOrder)

                    orderInfo.SaveChanges()
                        int i = 0;
                        Customers newCustomer = new Customers();
                        newCustomer.CustomerId = Guid.NewGuid(); 
                        newCustomer.Name = "Customer-" + i.ToString();
                        newCustomer.Address = "Address" + i.ToString(); 
                        newCustomer.City = "Redmond"; 
                        newCustomer.Phone = "123 456-7890";
                        newCustomer.ZipCode = 98054;

                        Orders newOrder = new Orders();
                        newOrder.OrderId = i.ToString();
                        newOrder.Customers = newCustomer;
                        newOrder.ShippingAddress = "Address-" + 
                                                        i.ToString();
                        newOrder.Tax = 0;
                        newOrder.TotalAmount = 0;

                        OrderLines newOrderLines = new OrderLines();
                        newOrderLines.OrderLineId = Guid.NewGuid(); 
                        newOrderLines.ProductName = "Product-" +
                            i.ToString(); 
                        newOrderLines.Quantity = 2; 
                        newOrderLines.UnitPrice = (decimal)67.70; 
                        newOrderLines.ExtendedPrice = 
                            newOrderLines.Quantity * 
                            newOrderLines.UnitPrice;

                        newOrder.OrderLines.Add(newOrderLines);

                        orderInfo.AddToCustomers(newCustomer);
                        orderInfo.AddToOrders(newOrder);

                        orderInfo.SaveChanges();

Перемещение по ассоциациям

Обращайтесь к сущности Orders, связанной с Customers, и сущности OrderLines, связанной с Orders, с помощью ассоциаций со свойством NavigationProperty, указанным в схеме. Дополнительные сведения о свойствах навигации см. в разделе Элемент NavigationProperty (язык EntityType CSDL).

Все свойства, использованные в этом примере, описаны в разделе Реализация ассоциаций (модель EDM).

В следующем цикле foreach происходит выборка коллекции Orders, которая содержится в атрибуте Customer.Orders свойства NavigationProperty, а также каждой из сущностей OrderLines, содержащейся в атрибуте Order.OrderLines свойства NavigationProperty. Метод Load необходимо вызывать перед перемещением по этим свойствам. Метод Load возвращает элементы из базы данных. (Альтернатива методу Load состоит в использовании свойства Source сущностей Orders и OrderLines.)

               For Each customer In orderInfo.Customers
                    Console.WriteLine("Customer: " + customer.Name)

                    ' If customer has orders, load orders.
                    customer.Orders.Load()
                    For Each order In orderInfo.Orders
                        Console.WriteLine(vbTab + "Order#: " _
                                          + order.OrderId)

                        ' Load orderlines
                        order.OrderLines.Load()
                        For Each orderline In order.OrderLines
                            Console.WriteLine(vbTab + vbTab + _
                                              orderline.ProductName)
                     Next
                 Next
                    foreach (Customers customer in orderInfo.Customers)
                    {
                        Console.WriteLine("Customer: " + 
                                              customer.Name);

                        //If customer has orders, load orders.
                        customer.Orders.Load();
                        foreach (Orders order in customer.Orders)
                        {
                            Console.WriteLine("\t" + order.OrderId);

                            // Load OrderLines.
                            order.OrderLines.Load();
                            foreach (OrderLines orderLine in 
                                     order.OrderLines)
                                Console.WriteLine(
                                 "\t\t" + orderLine.ProductName);
                        }
                    }

Соединение в App Config

Чтобы иметь возможность использовать сущности и ассоциации модели объектов OrderInfo, необходимо установить соединение с базой данных, в которой хранятся данные для приложений, построенных на основе модели EDM. Процесс открытия соединения, используемого в коде приложения, напоминает процесс открытия соединения SQL. Кроме строки соединения, которая служит в соединении SQL для идентификации базы данных и сервера, используемых этой моделью, соединению необходимы путь к EDM-схемам и спецификации сопоставления. В данном примере файл app.config содержит строку соединения и местоположение метаданных. Содержимое файла app.config показано в следующем коде:

?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="OrderInfo" 
                 connectionString='Metadata=.;
                 Provider=System.Data.SqlClient;
                 Provider Connection String="server=serverName;
                 database=OrderInfo;Integrated Security=true;
                 Connection Timeout=5;multipleactiveresultsets=true"'
                 providerName="System.Data.EntityClient"/>
    </connectionStrings>
</configuration>

Пример

Полный код, используемый для выполнения предыдущего фрагмента, показан в следующем примере. На то, что происходит вызов вспомогательного метода ComputeOrder , указывает комментарий в последнем фрагменте кода. Сведения о реализации вспомогательного метода см. в разделе Как настроить автоматически созданные объекты данных (платформа Entity Framework).

Imports OrderInfoModel
Module Module1

    Sub Main()
        Try
            Using orderInfo As OrderInfo = New OrderInfo()
                For Each customer In orderInfo.Customers
                    Console.WriteLine("Customer: " + customer.Name)

                    ' If customer has orders, load orders.
                    customer.Orders.Load()
                    For Each order In orderInfo.Orders
                        Console.WriteLine(vbTab + "Order#: " _
                                          + order.OrderId)

                        ' Load orderlines
                        order.OrderLines.Load()
                        For Each orderline In order.OrderLines
                            Console.WriteLine(vbTab + vbTab + _
                                              orderline.ProductName)
                        Next

                        For Each order2 In orderInfo.Orders
                            Console.WriteLine("Order#: " + _
                                               order2.OrderId)

                            ' Display OrderLines products and quantities.
                            order2.OrderLines.Load()
                            For Each orderline2 In order2.OrderLines
                                Console.WriteLine(vbTab + "{0} " + _
                                              "UnitPrice: ${1} " + _
                                              "Quantity: {2}", _
                                              orderline2.ProductName, _
                                              orderline2.UnitPrice, _
                                              orderline2.Quantity)

                                ' Open the commented code in this
                                ' section to use the ComputeOrder
                                ' helper method defined in the topic
                                ' Helper Methods (EDM).
                                'Console.WriteLine(vbTab + vbTab + _
                                'vbTab + "Total Order # {0}: " + _
                                '"${1} Including ${2} tax", _
                                'order2.OrderId, _
                                'Decimal.Round( _
                                'order2.ComputeOrder(), _
                                '2), _
                                'order2.Tax)

                            Next
                        Next
                    Next
                Next

                ' Set to True to add entities.
                If False Then
                    Dim i As Integer = 0
                    Dim newCustomer As Customers = _
                    New Customers()
                    newCustomer.CustomerId = _
                                    Guid.NewGuid()
                    newCustomer.Name = "Customer-" + _
                                    i.ToString()
                    newCustomer.Address = "Address-" + _
                                    i.ToString()
                    newCustomer.City = "Redmond"
                    newCustomer.Phone = "123 456-7890"
                    newCustomer.ZipCode = 98054

                    Dim newOrder As New Orders()
                    newOrder.OrderId = i.ToString()
                    newOrder.Customers = newCustomer
                    newOrder.ShippingAddress = _
                                "Address-" + i.ToString()
                    newOrder.Tax = 0
                    newOrder.TotalAmount = 0

                    Dim newOrderLines As OrderLines = New OrderLines()
                    newOrderLines.OrderLineId = Guid.NewGuid()
                    newOrderLines.ProductName = "Product-" + _
                    i.ToString()
                    newOrderLines.Quantity = 2
                    newOrderLines.UnitPrice = 67.71
                    newOrderLines.ExtendedPrice = _
                        newOrderLines.Quantity * _
                        newOrderLines.UnitPrice

                    newOrder.OrderLines.Add(newOrderLines)

                    orderInfo.AddToCustomers(newCustomer)
                    orderInfo.AddToOrders(newOrder)

                    orderInfo.SaveChanges()

                End If

            End Using

        Catch ex As Exception
            Console.WriteLine(ex.Message.ToString() + "\n" + _
                              ex.InnerException.ToString())
        End Try

    End Sub

End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OrderInfoModel;

namespace Associations_CS
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (OrderInfo  orderInfo = new OrderInfo())
                {
                    foreach (Customers customer in orderInfo.Customers)
                    {
                        Console.WriteLine("Customer: " + 
                                              customer.Name);

                        //If customer has orders, load orders.
                        customer.Orders.Load();
                        foreach (Orders order in customer.Orders)
                        {
                            Console.WriteLine("\t" + order.OrderId);

                            // Load OrderLines.
                            order.OrderLines.Load();
                            foreach (OrderLines orderLine in 
                                     order.OrderLines)
                                Console.WriteLine(
                                 "\t\t" + orderLine.ProductName);
                        }
                    }

                    foreach (Orders order in orderInfo.Orders)
                    {
                        Console.WriteLine("Order: " + order.OrderId);

                        // Display OrderLines products and quantities.
                        order.OrderLines.Load();
                        foreach (OrderLines orderLine in 
                                 order.OrderLines)
                            Console.WriteLine(
                                "\t{0}  UnitPrice: ${1} Quantity: {2}", 
                                orderLine.ProductName,
                                orderLine.UnitPrice,
                                orderLine.Quantity );

                        // Open the commented code in this section to
                        // use the ComputeOrder helper method defined
                        // in the topic Helper Methods (EDM).
                      /*Console.WriteLine("\t\t\tTotal Order #{0}: " +
                                     "${1} Including ${2} tax", 
                                     order.OrderId,
                                     Decimal.Round(
                                     order.ComputeOrder(), 2),
                                     order.Tax); */

                    }

                    if(false)  // Set to true to add entities.
                    {
                        int i = 0;
                        Customers newCustomer = new Customers();
                        newCustomer.CustomerId = Guid.NewGuid(); 
                        newCustomer.Name = "Customer-" + i.ToString();
                        newCustomer.Address = "Address" + i.ToString(); 
                        newCustomer.City = "Redmond"; 
                        newCustomer.Phone = "123 456-7890";
                        newCustomer.ZipCode = 98054;

                        Orders newOrder = new Orders();
                        newOrder.OrderId = i.ToString();
                        newOrder.Customers = newCustomer;
                        newOrder.ShippingAddress = "Address-" + 
                                                        i.ToString();
                        newOrder.Tax = 0;
                        newOrder.TotalAmount = 0;

                        OrderLines newOrderLines = new OrderLines();
                        newOrderLines.OrderLineId = Guid.NewGuid(); 
                        newOrderLines.ProductName = "Product-" +
                            i.ToString(); 
                        newOrderLines.Quantity = 2; 
                        newOrderLines.UnitPrice = (decimal)67.70; 
                        newOrderLines.ExtendedPrice = 
                            newOrderLines.Quantity * 
                            newOrderLines.UnitPrice;

                        newOrder.OrderLines.Add(newOrderLines);

                        orderInfo.AddToCustomers(newCustomer);
                        orderInfo.AddToOrders(newOrder);

                        orderInfo.SaveChanges();

                        
                    }
                }
            }

            catch (System.Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            
        }
    }
}

См. также

Основные понятия

Реализация ассоциаций (модель EDM)
Свойства навигации (модель EDM)