Anwendungscode mit Zuordnungen (EDM)
Das im Entitätsdatenmodell (EDM)-Thema Implementieren von Zuordnungen (EDM) entworfene Objektmodell kann von Clientanwendungen verwendet werden. EDM-Anwendungen können Daten ohne SQL-Anweisungen instanziieren, abfragen und dauerhaft speichern. Weitere Informationen finden Sie unter Übersicht über Object Services (Entity Framework).
Der Anwendungscode in diesem Thema veranschaulicht, wie Zuordnungen der Entitäten mit dem Namen Customers und Orders instanziiert werden und in den Zuordnungen zwischen Customers und Orders sowie zwischen Orders und OrderLines navigiert werden kann.
Erstellen und Initialisieren von Entitäten
Im folgenden Codeausschnitt ist dargestellt, wie eine Instanz für jeden der drei Typen Customers
, Orders
und OrderLines
erstellt wird. Eine Verbindung mit dem Namespace OrderInfo
wird in folgender Codezeile instanziiert: OrderInfo orderInfo = new OrderInfo()
.
Da die Entitäten programmierbare Klassen sind, werden sie mit dem Konstruktor erstellt, der beim Erstellen der Klassenbibliothek bereitgestellt wird. Fügen Sie diese Entitäten dem Objektkontext mithilfe der AddToOrderInfo
-Methode von OrderInfo
ObjectContext hinzu. Weitere Informationen finden Sie unter Hinzufügen, Ändern und Löschen von Objekten (Entity Framework).
Das folgende Codesegment erstellt einen Customer
, eine Order
und eine OrderLine
. Der Code instanziiert außerdem Zuordnungen zwischen Customer
und Order
sowie zwischen Order
und OrderLine
.
Die Objekte werden nach dem Initialisieren im folgenden Code zum Speichern hinzugefügt, und die Änderungen werden gespeichert.
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();
Navigieren in Zuordnungen
Greifen Sie unter Verwendung von Zuordnungen mit der im Entwurfsschema angegebenen NavigationProperty auf die mit Customers
verknüpften Orders
sowie auf die mit Orders
verknüpften OrderLines
zu. Weitere Informationen über Navigationseigenschaften finden Sie unter NavigationProperty-Element (EntityType CSDL) .
Eine Beschreibung aller in diesem Beispiel verwendeten Eigenschaften finden Sie unter Implementieren von Zuordnungen (EDM) .
Von der folgenden foreach-Schleife wird die Auflistung der Orders
, die in der Customer.Orders
NavigationProperty enthalten sind, sowie jede der in der Order.OrderLines
NavigationProperty enthaltenen OrderLines
abgerufen. Die Load-Methode muss vor dem Navigieren dieser Eigenschaften aufgerufen werden. Von der Load-Methode werden die Elemente aus der Datenbank abgerufen. (Eine Alternative zur Load-Methode ist die Verwendung der Source
-Eigenschaft von Orders
und 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);
}
}
Verbindungen in der 'App Config'-Datei
Um die Entitäten und Zuordnungen des OrderInfo
-Objektmodells verwenden zu können, ist eine Verbindung mit der Datenbank erforderlich, die die Daten für die mit dem Entity Data Model (EDM) erstellten Anwendungen speichert. Das Öffnen der vom Anwendungscode verwendeten Verbindung ist vergleichbar mit dem Öffnen einer SQL-Verbindung. Zusätzlich zu der Verbindungszeichenfolge, die von einer SQL-Verbindung verwendet wird, um die von diesem Modell verwendete Datenbank und den Server zu identifizieren, ist für die Verbindung ein Pfad zu den EDM-Schemas und Zuordnungsspezifikationen erforderlich. In diesem Beispiel ist die Verbindungszeichenfolge und der Speicherort der Metadaten in der app.config-Datei enthalten. Der Inhalt der app.config -Datei ist im folgenden Code dargestellt:
?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>
Beispiel
Der vollständige Code, der zu Ausführung des vorherigen Segments verwendet wird, ist im folgenden Beispiel dargestellt. Der Aufruf an die Hilfsmethode ComputeOrder
wird durch einen Kommentar im letzten Codesegment identifiziert. Informationen zur Implementierung der Hilfsmethode finden Sie unter Gewusst wie: Anpassen von generierten Datenobjekten (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());
}
}
}
}
Siehe auch
Konzepte
Implementieren von Zuordnungen (EDM)
Navigationseigenschaften (EDM)