Introduction
One of the questions that you may ask yourself with the new EF feature CTP5 is how to 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 ObjectContext
s a data source of the service. The following code is a simple WCF Data Service on top of EF ObjectContext
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 DbContext
nd WCF Data Services integration isn’t working well. So what can we do for now?
Since the DbContext
s a wrapper for the ObjectContext
we can expose the ObjectContext
tself. In order to do that, you will have to override the CreateDataSource
ethod of the service and return the ObjectContext
The following example shows a simple WCF Data Service that uses the DbContext
’ve created in the previous post about EF Feature CTP fluent API:
[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
CreateDataSource
I cast the DbContext
o an interface it implements – IObjectContextAdapter
This interface exposes an ObjectContext
roperty 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
DbContext
ntegration with WCF Data Services isn’t supported currently. In order to have a working workaround for that, you can use the underling ObjectContext
hich the DbContext
rap. Hopefully in the near future, this workaround won’t be needed and we will have integration out of the box.