Das Protokoll "OData" erfordert, dass alle Entitäten über ihre kanonische Form adressiert werden können. Das bedeutet, dass jede Entität den Schlüssel der partitionierten Stammentität, den Schemastamm, enthalten muss.
/Customer('ACME')/order(100)
In WCF Data Services muss die untergeordnete Entität direkt adressierbar sein, d. h., der Schlüssel im Schemastamm muss Teil des Schlüssels der untergeordneten Entität sein: /Order(customer_customerId='ACME', orderId=100). Dies wird erreicht, indem eine Assoziation zur Stammentität erstellt wird, wobei die 1:1- bzw. N:1-Assoziation zur Stammentität auch als Schlüssel bezeichnet wird. Wenn Entitäten in den Schlüssel eingeschlossen werden, werden die Attribute der übergeordneten Entität als Schlüsseleigenschaften bereitgestellt.
Das Customer/Order-Entitätsschemadiagramm veranschaulicht, wie jede Entität unter Verwendung des Customer partitioniert wird. Die Entität "Order" enthält den Customer als Teil ihres Schlüssels und ist deshalb direkt adressierbar. Der REST-Datenservice stellt alle Schlüsselassoziationen als einzelne Eigenschaften bereit: Order hat customer_customerId, und OrderDetail hat order_customer_customerId und order_orderId.
Mit der API "EntityManager" können Sie die Order-Entität anhand der Customer- und Order-ID suchen:
transaction.begin();
// Order mit Customer suchen. Die ID wird erst dann in die Klasse
// Customer eingeschlossen, wenn die OrderId-Schlüsselinstanz erstellt wird.
Order order = (Order) em.find(Order.class,
new OrderId(100, new Customer('ACME')));
...
transaction.commit();
/Order(orderId=100, customer_customerId='ACME')
/Customer('ACME')/orders?$filter=orderId eq 100
Auf den Kundenschlüssel wird über den Attributnamen der Customer-Entität, ein Unterstreichungszeichen und den Attributnamen der Customer-ID, customer_customerId, zugegriffen.
Eine Entität kann auch eine Entität, die keine Stammentität ist, in ihrem Schlüssel enthalten, wenn alle Vorgänger dieser Entität Assoziationen zur Stammentität haben. In diesem Beispiel hat OrderDetail eine Schlüsselassoziation zu Order und Order eine Schlüsselassoziation zur Customer-Stammentität. Verwendung der API "EntityManager":
transaction.begin();
// OrderDetailId-Schlüsselinstanz erstellen. Sie
// enthält Order und Customer, bei denen nur
// der Schlüssel definiert ist.
Customer customerACME = new Customer("ACME");
Order order100 = new Order(100, customerACME);
OrderDetailId orderDetailKey =
new OrderDetailId(order100, "COMP");
OrderDetail orderDetail = (OrderDetail)
em.find(OrderDetail.class, orderDetailKey);
...
Der REST-Datenservice lässt die direkte Adressierung von OrderDetail zu:
/OrderDetail(productId=500, order_customer_customerId='ACME', order_orderId =100)
Die Assoziation von der Entität "OrderDetail" zur Entität "Product" wurde unterbrochen, um die unabhängige Partitionierung von Order- und Product-Inventar zuzulassen. Die Entität "OrderDetail" speichert die Kategorie und die Produkt-ID anstelle einer festen Beziehung. Durch die Entkopplung der beiden Entitätsschemas wird jeweils nur auf eine einzige Partition zugegriffen.
Das im Diagramm dargestellte Category/Product-Schema zeigt, dass "Category" die Stammentität ist und dass jedes "Product" eine Assoziation zu einer Entität "Category" hat. Die Entität "Category" ist in der Product-ID enthalten. Der REST-Datenservice stellt eine Schlüsseleigenschaft bereit, category_categoryId, die über das Produkt direkt adressiert werden kann.
Da Category die Stammentität ist, muss die Category in einer partitionierten Umgebung bekannt sein, damit das Product gefunden wird. Wenn die API "EntityManager" verwendet wird, muss die Transaktion vor der Suche des Product an die Entität "Category" gebunden werden.
Verwendung der API "EntityManager":
transaction.begin();
// Stammentität Category nur mit dem Schlüssel erstellen. Auf diese
// Weise kann eine ProductId erstellt werden, ohne zuerst die
// Category suchen zu müssen. Die Transaktion ist jetzt an die
// Partition gebunden, in der die Category "COMP" gespeichert ist.
Category cat = new Category("COMP");
Product product = (Product) em.find(Product.class,
new ProductId(500, cat));
...
Der REST-Datenservice ermöglicht die direkte Adressierung des Product:
/Product(productId=500, category_categoryId='COMP')