Код приложения с использованием ассоциаций (модель 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
контекста OrderInfo
ObjectContext. Дополнительные сведения см. в разделе Добавление, изменение и удаление объектов (платформа 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)