Code d'application utilisant des associations (EDM)
Le modèle objet conçu dans la rubrique EDM (Modèle de données d'entité) Implémentation d'associations (EDM) peut être utilisé par les applications clientes. Les applications EDM peuvent instancier, interroger et rendre persistantes des données sans instructions SQL. Pour plus d'informations, voir Vue d'ensemble d'Object Services (Entity Framework).
Le code d'application présenté dans cette rubrique montre comment instancier des associations des entités nommées Customers et Orders, et comment explorer les associations entre Customers et Orders et entre Orders et OrderLines.
Création et initialisation d'entités
L'extrait de code suivant montre comment créer une instance de chacun des trois types : Customers
, Orders
et OrderLines
. Une connexion à l'espace de noms OrderInfo
est instanciée sur une seule ligne de code : OrderInfo orderInfo = new OrderInfo()
.
Les entités étant des classes programmables, elles sont crées à l'aide du constructeur fourni lorsque la bibliothèque de classes est générée. Ajoutez ces entités au contexte de l'objet à l'aide de la méthode AddToOrderInfo
de l'objet OrderInfo
ObjectContext. Pour plus d'informations, voir Ajout, modification et suppression d'objets (Entity Framework).
Le segment de code suivant crée une entité Customer
, une entité Order
et une entité OrderLine
. Le code instancie également des associations entre l'entité Customer
et l'entité Order
, et entre l'entité Order
et l'entité OrderLine
.
Une fois tous les objets initialisés dans le code suivant, ils sont ajoutés dans le stockage et les modifications sont enregistrées.
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();
Exploration d'associations
Pour accéder à l'entité Orders
liée à Customers
et à l'entité OrderLines
liée à Orders
, utilisez des associations avec la valeur NavigationProperty spécifiée dans la structure de schéma. Pour plus d'informations sur les propriétés de navigation, voir Élément NavigationProperty (EntityType CSDL).
Toutes les propriétés utilisées dans cet exemple sont décrites dans Implémentation d'associations (EDM).
La boucle foreach suivante récupère la collection d'entités Orders
qui est contenue dans l'élément NavigationPropertyCustomer.Orders
et chacune des entités OrderLines
qui sont contenues dans l'élément NavigationPropertyOrder.OrderLines
. La méthode Load doit être appelée avant d'explorer ces propriétés. La méthode Load obtient les éléments à partir de la base de données. (Une alternative à la méthode Load est l'utilisation de la propriété Source
de Orders
et de 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);
}
}
Connexion dans app.config
L'utilisation des entités et des associations du modèle objet OrderInfo
requiert une connexion à la base de données qui stocke les données des applications générées sur le modèle EDM (Entity Data Model). L'ouverture de la connexion utilisée par le code d'application ressemble à l'ouverture d'une connexion SQL. Outre la chaîne de connexion qui est utilisée par une connexion SQL pour identifier la base de données et le serveur qui est utilisé par ce modèle, la connexion requiert un chemin d'accès aux schémas EDM et aux spécifications de mappage. Dans cet exemple, un fichier app.config contient la chaîne de connexion et l'emplacement des métadonnées. Le contenu du fichier app.config est présenté dans le code suivant :
?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>
Exemple
Le code complet utilisé pour exécuter le segment précédent est présenté dans l'exemple suivant. L'appel à la méthode d'assistance ComputeOrder
****est identifié par un commentaire dans le dernier segment du code. Pour l'implémentation de la méthode d'assistance, voir Procédure : personnaliser des objets de données générés (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());
}
}
}
}
Voir aussi
Concepts
Implémentation d'associations (EDM)
Propriétés de navigation (EDM)