How to: Create a Data Service Using the Reflection Provider (WCF Data Services)
Important
WCF Data Services has been deprecated and will no longer be available for download from the Microsoft Download Center. WCF Data Services supported earlier versions of the Microsoft OData (V1-V3) protocol only and has not been under active development. OData V1-V3 has been superseded by OData V4, which is an industry standard published by OASIS and ratified by ISO. OData V4 is supported through the OData V4 compliant core libraries available at Microsoft.OData.Core. Support documentation is available at OData.Net, and the OData V4 service libraries are available at Microsoft.AspNetCore.OData.
RESTier is the successor to WCF Data Services. RESTier helps you bootstrap a standardized, queryable, HTTP-based REST interface in minutes. Like WCF Data Services before it, Restier provides simple and straightforward ways to shape queries and intercept submissions before and after they hit the database. And like Web API + OData, you still have the flexibility to add your own custom queries and actions with techniques you're already familiar with.
WCF Data Services enables you to define a data model that is based on arbitrary classes as long as those classes are exposed as objects that implement the IQueryable<T> interface. For more information, see Data Services Providers.
Example
The following example defines a data model that includes Orders
and Items
. The entity container class OrderItemData
has two public methods that return IQueryable<T> interfaces. These interfaces are the entity sets of the Orders
and Items
entity types. An Order
can include multiple Items
, so the Orders
entity type has an Items
navigation property that returns a collection of Items
objects. The OrderItemData
entity container class is the generic type of the DataService<T> class from which the OrderItems
data service is derived.
Note
Because this example demonstrates an in-memory data provider and changes are not persisted outside of the current object instances, there is no benefit derived from implementing the IUpdatable interface. For an example that implements the IUpdatable interface, see How to: Create a Data Service Using a LINQ to SQL Data Source.
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
namespace CustomDataServiceClient
{
[DataServiceKeyAttribute("OrderId")]
public class Order
{
public int OrderId { get; set; }
public string Customer { get; set; }
public IList<Item> Items { get; set; }
}
[DataServiceKeyAttribute("Product")]
public class Item
{
public string Product { get; set; }
public int Quantity { get; set; }
}
public partial class OrderItemData
{
#region Populate Service Data
static IList<Order> _orders;
static IList<Item> _items;
static OrderItemData()
{
_orders = new Order[]{
new Order(){ OrderId=0, Customer = "Peter Franken", Items = new List<Item>()},
new Order(){ OrderId=1, Customer = "Ana Trujillo", Items = new List<Item>()}};
_items = new Item[]{
new Item(){ Product="Chai", Quantity=10 },
new Item(){ Product="Chang", Quantity=25 },
new Item(){ Product="Aniseed Syrup", Quantity = 5 },
new Item(){ Product="Chef Anton's Cajun Seasoning", Quantity=30}};
_orders[0].Items.Add(_items[0]);
_orders[0].Items.Add(_items[1]);
_orders[1].Items.Add(_items[2]);
_orders[1].Items.Add(_items[3]);
}
#endregion
public IQueryable<Order> Orders
{
get { return _orders.AsQueryable<Order>(); }
}
public IQueryable<Item> Items
{
get { return _items.AsQueryable<Item>(); }
}
}
public class OrderItems : DataService<OrderItemData>
{
// This method is called only once to initialize
//service-wide policies.
public static void InitializeService(IDataServiceConfiguration
config)
{
config.SetEntitySetAccessRule("Orders", EntitySetRights.All);
config.SetEntitySetAccessRule("Items", EntitySetRights.All);
}
}
}
Imports System.Collections.Generic
Imports System.Data.Services
Imports System.Data.Services.Common
Imports System.Linq
Namespace CustomDataServiceClient
<DataServiceKeyAttribute("OrderId")> _
Public Class Order
Private _orderId As Integer
Private _customer As String
Private _items As IList(Of Item)
Public Property OrderId() As Integer
Get
Return _orderId
End Get
Set(ByVal value As Integer)
_orderId = value
End Set
End Property
Public Property Customer() As String
Get
Return _customer
End Get
Set(ByVal value As String)
_customer = value
End Set
End Property
Public Property Items() As IList(Of Item)
Get
Return _items
End Get
Set(ByVal value As IList(Of Item))
_items = value
End Set
End Property
End Class
<EntityPropertyMappingAttribute("Product", "productname", _
"orders", "http://schema.examples.microsoft.com/dataservices", True)> _
<DataServiceKeyAttribute("Product")> _
Public Class Item
Private _product As String
Private _quantity As Integer
Public Property Product() As String
Get
Return _product
End Get
Set(ByVal value As String)
_product = value
End Set
End Property
Public Property Quantity() As Integer
Get
Return _quantity
End Get
Set(ByVal value As Integer)
_quantity = value
End Set
End Property
End Class
Partial Public Class OrderItemData
#Region "Populate Service Data"
Shared _orders As IList(Of Order)
Shared _items As IList(Of Item)
Sub New()
_orders = New Order() { _
New Order() With {.OrderId = 0, .Customer = "Peter Franken", .Items = New List(Of Item)()}, _
New Order() With {.OrderId = 1, .Customer = "Ana Trujillo", .Items = New List(Of Item)()}}
_items = New Item() { _
New Item() With {.Product = "Chai", .Quantity = 10}, _
New Item() With {.Product = "Chang", .Quantity = 25}, _
New Item() With {.Product = "Aniseed Syrup", .Quantity = 5}, _
New Item() With {.Product = "Chef Anton's Cajun Seasoning", .Quantity = 30}}
_orders(0).Items.Add(_items(0))
_orders(0).Items.Add(_items(1))
_orders(1).Items.Add(_items(2))
_orders(1).Items.Add(_items(3))
End Sub
#End Region
Public ReadOnly Property Orders() As IQueryable(Of Order)
Get
Return _orders.AsQueryable()
End Get
End Property
Public ReadOnly Property Items() As IQueryable(Of Item)
Get
Return _items.AsQueryable()
End Get
End Property
End Class
Public Class OrderItems
Inherits DataService(Of OrderItemData)
' This method is called only once to initialize
' service-wide policies.
Shared Sub InitializeService(ByVal config As DataServiceConfiguration)
config.SetEntitySetAccessRule("Orders", EntitySetRights.All)
config.SetEntitySetAccessRule("Items", EntitySetRights.All)
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2
End Sub
End Class
End Namespace