Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

Using EF DbContext with WCF Data Services

5.00/5 (2 votes)
11 Dec 2010CPOL2 min read 29.6K  
Using EF DbContext with WCF Data Services

Introduction

One of the questions that you may ask yourself with the new EF feature CTP5 is how Using DbContext with WCF Data Servicesto embed the new DbContext object inside an OData service or more particularly inside WCF Data Service. This post will supply the solution.

DbContext as WCF Data Service Data Source

Entity Framework has a good integration with WCF Data Services. All you need to do when you create a WCF Data Service with EF is to put the generated ObjectContexts a data source of the service. The following code is a simple WCF Data Service on top of EF ObjectContext

C#
public</span /> class</span /> SchoolDataService : DataService<SchoolEntities>
{
  public</span /> static</span /> void</span /> InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("</span />*"</span />, EntitySetRights.AllRead);
 
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }
}

When you will try to do the same with DbContext, you will get a surprise. The service will run but when you will try to query the data it exposes, you will get an error like the following:

The XML page cannot be displayed 
Cannot view XML input using XSL style sheet. 
Please correct the error and then click the Refresh button, or try again later. 

-------------------------------------------------------------------------------
The following tags were not closed: feed. 
Error processing resource 'http://localhost:29753/SchoolDataService.svc/Courses'. 

The reason for the error is because currently DbContextnd WCF Data Services integration isn’t working well. So what can we do for now?
Since the DbContexts a wrapper for the ObjectContextwe can expose the ObjectContexttself. In order to do that, you will have to override the CreateDataSourceethod of the service and return the ObjectContextThe following example shows a simple WCF Data Service that uses the DbContext’ve created in the previous post about EF Feature CTP fluent API:

C#
[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
public</span /> class</span /> SchoolDataService : DataService<ObjectContext>
{
  public</span /> static</span /> void</span /> InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("</span />*"</span />, EntitySetRights.AllRead);
 
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }
 
  protected</span /> override</span /> ObjectContext CreateDataSource()
  {     
    var</span /> context = ((IObjectContextAdapter)new</span /> SchoolEntities()).ObjectContext;      
    context.ContextOptions.ProxyCreationEnabled = false</span />;      
    return</span /> context;    
  }    
}

A few things to notice:

  • In the CreateDataSourceI cast the DbContexto an interface it implements – IObjectContextAdapterThis interface exposes an ObjectContextroperty which is the underlying context wrapped by the DbContext
  • You must disable proxy creation because in service scenarios you mustn't use the change tracking and lazy loading behaviors that are created through runtime proxies.

Summary

DbContextntegration with WCF Data Services isn’t supported currently. In order to have a working workaround for that, you can use the underling ObjectContexthich the DbContextrap. Hopefully in the near future, this workaround won’t be needed and we will have integration out of the box.


License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)