使用关联的应用程序代码 (EDM)

客户端应用程序可以使用在 实体数据模型 (EDM) 主题实现关联 (EDM) 中设计的对象模型。EDM 应用程序不需要使用 SQL 语句即可实例化、查询和持久保留数据。有关更多信息,请参见对象服务概述(实体框架)

本主题中演示的应用程序代码说明如何实例化名为 CustomersOrders 的实体的关联,以及如何在 CustomersOrders 之间以及在 OrdersOrderLines 之间导航关联。

创建和初始化实体

下面的代码段演示如何为以下三种类型的每一种创建一个实例:CustomersOrdersOrderLines。与 OrderInfo 命名空间的连接在以下一行代码中实例化:OrderInfo orderInfo = new OrderInfo()

由于实体是可编程类,因此,可以使用生成类库时提供的构造函数来创建这些实体。可使用 OrderInfoObjectContextAddToOrderInfo 方法将这些实体添加到对象上下文。有关更多信息,请参见添加、修改和删除对象(实体框架)

下面的代码段创建 CustomerOrderOrderLine。该代码还实例化 CustomerOrder 之间的关联以及 OrderOrderLine 之间的关联。

在以下代码中初始化对象之后,这些对象将被添加到存储中,并保存更改。

                    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();

导航关联

使用关联以及在设计架构中指定的 NavigationProperty 访问与 Customers 相关的 Orders 和与 Orders 相关的 OrderLines。有关导航属性的更多信息,请参见 NavigationProperty 元素 (EntityType CSDL)

本示例中使用的所有属性均在实现关联 (EDM) 中介绍。

下面的 foreach 循环检索 Customer.OrdersNavigationProperty 中包含的 Orders 的集合以及 Order.OrderLinesNavigationProperty 中包含的每个 OrderLines。必须首先调用 Load 方法,然后才能导航这些属性。Load 方法从数据库中获取项。(Load 方法的备选方法是使用 OrdersOrderLinesSource 属性。)

               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);
                        }
                    }

应用程序配置中的连接

使用 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 的调用由代码的最后一段中的注释标识。有关帮助器方法的实现,请参见如何:自定义生成的数据对象(实体框架)

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)