Using WCF Data Services 5.6.0 with Entity Framework 6+
And now for some exciting news: you can finally use WCF Data Services with Entity Framework 6+! Today we are uploading a new NuGet package called WCF Data Services Entity Framework Provider. This NuGet package bridges the gap between WCF Data Services 5.6.0 and Entity Framework 6+. We were able to build this provider as an out-of-band provider (that is, a provider that ships apart from the core WCF DS stack) because of the public provider work we did recently.
Upgrading an existing OData service to EF 6
If you are upgrading an existing OData service to Entity Framework 6 or greater, you will need to do a couple of things:
- Install the WCF Data Services Entity Framework Provider NuGet package. Since this package has a dependency on WCF Data Services 5.6.0 and Entity Framework 6 or greater, some of the other NuGet packages in your project may be upgraded as well.
- Replace the base type of your DataService. For EF 5 or below, your data service should inherit from
DataService<T>
whereT
is aDbContext
orObjectContext
. For EF 6 or greater, your data service should inherit fromEntityFrameworkDataService<T>
whereT
is aDbContext
. See What’s the difference between DataService and EntityFrameworkDataService below for more details.
Creating a new OData service with EF 6
If you are creating a new OData service and would like to use Entity Framework 6 or greater, you will need to follow similar steps:
- Create your new project. I typically use an ASP.NET Empty Web Application for this, but you can use whatever you want. Note that if you do use the empty template, you may need to create an
App_Data
folder for Entity Framework to work properly with LocalDB. - Install the WCF Data Services Entity Framework Provider NuGet package. Since this package has a dependency on WCF Data Services 5.6.0 and Entity Framework 6 or greater, some of the other NuGet packages in your project may be upgraded as well.
- Add a new WCF Data Service. It’s best if you ensure that your tooling is up-to-date as we occasionally fix bugs in the item template. Our latest tooling installer was released with WCF DS 5.6.0. It can be downloaded here.
- Replace the base type of the DataService that was generated by the item template. For EF 6 or greater, your data service should inherit from
EntityFrameworkDataService<T>
whereT
is aDbContext
. See What’s the difference between DataService and EntityFrameworkDataService below for more details.
What’s the difference between DataService<T> and EntityFrameworkDataService<T>?
Historically the WCF DS stack required all WCF DS-based OData services to inherit from DataService<T>
. Internally, the data service would determine whether the service should use the in-box EF provider, the in-box Reflection provider, or a custom provider. When we added support for EF 6, we utilized the new public provider functionality to allow the provider to ship separately. This will allow us, for instance, to use WCF DS 5.6.0 with either EF 5, 6, or some future version. However, the new public provider functionality comes with a little bit of code you need to write. Since that code should be the same for every default EF 6 WCF DS provider, we went ahead and included a class that does this for you. EntityFrameworkDataService<T>
inherits from DataService<T>
and implements all the code you would need to implement otherwise. By shipping this additional class, we literally made the upgrade process as simple as changing the base type of your service.
Feedback please
We are heads down on getting our stacks updated to support OData v4, so we’ve had very limited resources to focus on testing this provider. We have a few automated tests and have tried a number of ad-hoc tests. That said, our coverage could be better so… we’re going to rely on you, our dear customer, to provide feedback of whether or not this provider works in your situation. If we don’t hear anything back, we’ll go ahead and release the provider in a week or so.
Thanks,
The OData Team
Comments
Anonymous
October 03, 2013
Good News! I've tried to "Creating a new OData service with EF 6" and faced The type 'Microsoft.OData.Service.DataService`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.OData.Service, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. C:Users***DocumentsVisual Studio 2012ProjectsODataEF6SampleODataEF6SampleWcfDataService.svc.cs 17 18 ODataEF6Sample Anyone else facing this? What's wrong?Anonymous
October 05, 2013
Hi You haveany queries visit www.kbreducation.comAnonymous
October 05, 2013
If you want to strong with .net , then follow www.kbreducation.comAnonymous
October 05, 2013
I get this: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "System.Data.Services.resources" was correctly embedded or linked into assembly "Microsoft.OData.EntityFrameworkProvider" at compile time, or that all the satellite assemblies required are loadable and fully signedAnonymous
October 09, 2013
I also get this error: The type 'Microsoft.OData.Service.DataService`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.OData.Service, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Any solutions?Anonymous
October 14, 2013
Hi , i have the same error please fix that The type 'Microsoft.OData.Service.DataService`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.OData.Service, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35Anonymous
October 15, 2013
Ditto on the: The type 'Microsoft.OData.Service.DataService`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.OData.Service, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Any fixes?Anonymous
October 15, 2013
Nevermind the alpha2 Nuget package fixes thisAnonymous
October 16, 2013
Same with this error: The type 'Microsoft.OData.Service.DataService`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.OData.Service, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Anyone found a fix? I am yet to find any working MS WCF tutorial that works.Anonymous
October 16, 2013
The comment has been removedAnonymous
October 17, 2013
Hi, I have been getting the following error whilst hitting an upgraded WCF Data Service System.InvalidOperationException The resource contains value '<Complex Type Here>' which cannot be serialized. at System.Data.Services.LiteralFormatter.FormatRawLiteral(Object value) at System.Data.Services.LiteralFormatter.FormatAndEscapeLiteral(Object value) at System.Data.Services.LiteralFormatter.DefaultLiteralFormatter.FormatLiteralWithTypePrefix(Object value) at System.Data.Services.LiteralFormatter.DefaultLiteralFormatter.Format(Object value) at System.Data.Services.WebUtil.GetETagValue(Object resource, ResourceType resourceType, ICollection1 etagProperties, IDataService service, Boolean getMethod) at System.Data.Services.WebUtil.CompareAndGetETag(Object parentEntityResource, Object parentEntityToken, ResourceSetWrapper container, IDataService service, Boolean& writeResponseForGetMethods) at System.Data.Services.DataService
1.CompareETagAndWriteResponse(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage) at System.Data.Services.DataService1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage) at System.Data.Services.DataService
1.HandleNonBatchRequest(RequestDescription description) at System.Data.Services.DataService`1.HandleRequest()Anonymous
October 17, 2013
Hi, ask a question about Edm.DateTime atom format: www.odata.org/.../atom-format default: yyyy "-" mm "-" dd "T" hh ":" mm [":" ss["." fffffff]] for example china beijing Time : 2013-10-10 08:00 , result to: 2013-10-10T00:00 what can i do , change default format, to china format? thinks a lot. my email: 18552070@qq.com I'm sorray,My English bad, chinese as follow:
你好,问一个关于WCF Data Service的Edm.DateTime序列化格式的问题, www.odata.org/.../atom-format 默认格式:yyyy "-" mm "-" dd "T" hh ":" mm [":" ss["." fffffff]] 比如 中文北京时间:2013-10-10 08:00,默认输出变成:2013-10-10T00:00 (日期和时间中间多一个T,中文时差8小时) 如何才能改成本地化的时间格式,这样显示对用户比较友好。 非常感谢! 我的邮箱:18552070@qq.com
Anonymous
October 19, 2013
The EntityFrameworkDataService<T> is not exposing properties such as CurrentDataSource of the parent DataService<T>. It has a method called CreateDataSource(). Am I missing something?Anonymous
October 20, 2013
Please disregard my previous question (error in FormatRawLiteral). The problem disappeared after restarting visual studio. Thanks.Anonymous
October 21, 2013
When using the EntityFrameworkDataService, I would expect to be able to use CurrentDataSource and override CreateDataSource just as with DataService<T>. Am I missing something here? Thanks!Anonymous
October 23, 2013
Please help me with this question: stackoverflow.com/.../wcf-data-services-5-6-entity-framework-6-0-1-code-first-with-vocabularies I'm facing a problem that Add Service Reference is not returning the properties of the fields that is generated from the edmx. For example this in the Reference.cs of the service is auto generated with WCF DataServices 5.6+EF5: <Property Name="CategoryName" Type="Edm.String" Nullable="false" MaxLength="15" FixedLength="false" Unicode="true" /> when I use EF ver 6.0.1 the service reference includes this code of the IEdmModel: <Property Name="CategoryName" Type="Edm.String" /> I need to return the full properties of the fields to the clientAnonymous
October 23, 2013
When addressing a collection of media entities, e.g. GET ~/Employees or the media resource of a single media entity, e.g. GET ~/Employees(1)/$value everything works fine, but when I address the media entity itself, e.g. GET ~/Employees(1) I now get the error message "To support streaming, the data service must implement IServiceProvider.GetService() to return an implementation of IDataServiceStreamProvider or the data source must implement IDataServiceStreamProvider." IServiceProvider.GetService() is implemented and returns an implementation of IDataServiceStreamProvider, and this works in the first two cases, but in the single entity access IServiceProvider.GetService() is now no longer called for type IDataServiceStreamProvider.Anonymous
October 23, 2013
Complex types no longer work, addressing an entity or entity set results in the error message "The resource contains value '<name of complex type>' which cannot be serialized."Anonymous
October 23, 2013
FunctionImports no longer work: the XxxEntities.cs file gets generated with invalid code: using System.Data.Objects; using System.Data.Objects.DataClasses; public virtual ObjectResult<SalesByYear_Result> SalesByYear(Nullable<System.DateTime> beginning_Date, Nullable<System.DateTime> ending_Date) { var beginning_DateParameter = beginning_Date.HasValue ? new ObjectParameter("Beginning_Date", beginning_Date) : new ObjectParameter("Beginning_Date", typeof(System.DateTime)); var ending_DateParameter = ending_Date.HasValue ? new ObjectParameter("Ending_Date", ending_Date) : new ObjectParameter("Ending_Date", typeof(System.DateTime)); return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<SalesByYear_Result>("SalesByYear", beginning_DateParameter, ending_DateParameter); } Neither the two namespaces nor the used types ObjectResult and ObjectParameter exist.Anonymous
October 24, 2013
Has anyone had an issue with the $expand using this update? Seems to not work for me. I have posted a question to Stack Overflow here: stackoverflow.com/.../ef-6-wcf-data-services-5-6-odata-expand-not-workingAnonymous
October 28, 2013
Using the Alpha 2 release from NuGet, I am able to compile the service, but when accessing it I receive the following exception: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "System.Data.Services.resources" was correctly embedded or linked into assembly "Microsoft.OData.EntityFrameworkProvider" at compile time, or that all the satellite assemblies required are loadable and fully signed. Is anyone else having issues loading resources for the Alpha 2 release? FWIW, my /bin/lc/ folders (e.g., /bin/ja/) contain the v5.6.0 versions of Microsoft.Data.Services.resources.dll, which I would assume the EntityFrameworkProvider utilizes.Anonymous
October 29, 2013
Unless I’m missing something, this release manages to completely omit all Referential Constraints from the metadata of any Code First EF model. ( I haven’t tried a Database first model yet). The spec is pretty clear that these should be supported www.odata.org/.../common-schema-definition-language-csdl and they were in the previous WCF Data Services release for Entity Framework 5. But now they seem to be gone and the fact is not mentioned anywhere. Am I missing something?Anonymous
October 30, 2013
@Jeremy Caney Same here, am using alpha2, using System.Data.Services.Providers; public class SomeDataService : EntityFrameworkDataService<SomeDBEntities> get a runtime error: The server encountered an error processing the request. The exception message is 'Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "System.Data.Services.resources" was correctly embedded or linked into assembly "Microsoft.OData.EntityFrameworkProvider" at compile time, or that all the satellite assemblies required are loadable and fully signed.'. See server logs for more details.Anonymous
October 31, 2013
I am also getting the error: The server encountered an error processing the request. The exception message is 'Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "System.Data.Services.resources" was correctly embedded or linked into assembly "Microsoft.OData.EntityFrameworkProvider" at compile time, or that all the satellite assemblies required are loadable and fully signed.' I am using the package 1.0.0-alpha2.Anonymous
October 31, 2013
RESOLVED I resolved the error... The server encountered an error processing the request. The exception message is 'Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "System.Data.Services.resources" was correctly embedded or linked into assembly "Microsoft.OData.EntityFrameworkProvider" at compile time, or that all the satellite assemblies required are loadable and fully signed.' by removing enums from my data model. It seems OData does not support enum types and supplies us with this unfortunately misleading exception when you include them.Anonymous
November 01, 2013
Need Geography and Geometry support Entity Framework in OData Service using SQL Server, or some features to be able use SQL Geography.Anonymous
November 01, 2013
John C: Wow, great catch! Indeed, a very bizarre error message to throw. I wonder if it's throwing an exception when trying to lookup a localized resource for that error. Regardless, an unfortunate limitation; I'm fond of my enums, although I suppose it's easy enough to replace them with a lookup table whose values correspond to the enum values. Not quite as elegant of syntax due to the need to cast enums as integers, but a perfectly acceptable compromise to get Data Services working with Entity Framework 6.0. Thanks for digging into that, and for reporting back on your find.Anonymous
November 05, 2013
The resource error is actually a second error. It seems the Entity Framework provider DLL is missing the string resources (resx file I'm guessing) for error messages. So actually you see an error trying to get an error message string! You have to look at the stack trace to see what error message it was trying to get and then go look it up in the resources for the parent Microsoft.Data.Services (server) DLL. In my case, it was "DataService_CannotPerformOperationWithoutETag", something to do with concurrency that wasn't an issue when using EF5. It only occurred on PATCH (update) requests, though (and possibly inserts, didn't attempt those) even though reading data seemed to work okay. We've since reverted back to EF5 until things smooth out.Anonymous
November 06, 2013
It seems that complex types no longer works with this provider. I have an entity with a complex type and everything is working fine with EF5 and Data Service 5.6, but as soon as I migrate to EF6 and use the new provider I have the following error when I try to do a query : The resource contains value '<fullname of the complex type>' which cannot be serialized. If I remove the complex type the issue disappear and everything seems to work fine. To be sure it wasn't an issue with my EDMX or my model, I have created from scratch a small, single entity, EDMX and I have exactly the same issue as soon as I start using complex types.Anonymous
November 17, 2013
I have the same problem like Chris. The required reference to the assembly "Microsoft.OData.Service, Version=5.6.0.0" is missing! Where can i find this assembly?Anonymous
November 19, 2013
After updating.. I'm trying to add a new Service Operation to my Service and when I try to access my resource via CurrentDataSource.MyResource... MyResource is no longer available. Has this functionality chanced with the update? How do I get access to MyResource from within my new Service Operation?Anonymous
November 20, 2013
Function Imports are now located "above" CurrentDataSource... Instead of: this.CurrentDataSource.MyProc(), use: this.MyProc()Anonymous
November 20, 2013
Never mind the last post....garbage!Anonymous
November 22, 2013
I first installed the alpha 1 and received the error message that many on here have: Error 16 The type 'Microsoft.OData.Service.DataService`1<T0>' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.OData.Service, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. C:Realtime SourceRTR 6.xRTRServicesRTRWCFDataServiceRTRWCFDataServiceRTRWCFData.svc.cs 21 16 RTRWCFDataService I then read further to a post saying to install : Install-Package Microsoft.OData.EntityFrameworkProvider -Pre and this will install alpha2. When I do this my package manger has two errors : Exception calling "CreateInstanceFrom" with "8" argument(s): "Could not load type 'System.Data.Entity.ConnectionFactoryConfig.InitializeEntityFrameworkCommand' from assembly 'E ntityFramework.PowerShell, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'." At C:Realtime SourceRTR 6.xRTRServicesRTRWCFDataServicepackagesEntityFramework.6.0.1toolsEntityFramework.psm1:698 char:31
- $domain.CreateInstanceFrom <<<< ( + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException Exception calling "CreateInstanceFrom" with "8" argument(s): "Could not load type 'System.Data.Entity.ConnectionFactoryConfig.AddProviderCommand' from assembly 'EntityFramework .PowerShell, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'." At C:Realtime SourceRTR 6.xRTRServicesRTRWCFDataServicepackagesEntityFramework.6.0.1toolsEntityFramework.psm1:698 char:31
- $domain.CreateInstanceFrom <<<< ( + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException And I am no longer to access the Microsoft.OData namespace that I need to get the Provider EntityFrameworkDataService. Any help at all would be greatly appreciated.
Anonymous
December 05, 2013
The solution for me is that I had an enum usage inside my model...removing it make the error go away....hope this help !Anonymous
December 09, 2013
I am stymied by the TypeMismatchRelationshipConstraint validation error referenced by @Alberto Silva in comments to the 5.5.0. The error was introduced in 5.4.0. The error goes away with EF 6 but the new framework provider does not give me a viable upgrade path because of breaking changes. The lack of continuity is astonishing.Anonymous
December 10, 2013
The comment has been removedAnonymous
December 10, 2013
This solution works as explained with EF 6. But it seems that the provider has a problem wrapping/escaping "{" and "}" when querying for entities. E.g. (from x in [entity] where x.Name == "{" select x) would fail. NB: We did not have this problem with EF 5.5 (bacause we did not have to use the WCF Data Services Entity Framework Provider) Any fixes?Anonymous
December 12, 2013
Do you plan on getting CurrentDataSource to work again . It useless for me with out it. I sure most of us will need to access the dbContext at some point for non trivial appsAnonymous
December 16, 2013
CurrentDataSource no longer used to retrieve DBContext. Anyone idea about to retrieve DBContext' methods and properties?Anonymous
December 17, 2013
What I did to get around the CurrentDataSource problem was to override CreateDataSource to be this: protected override EntityFrameworkDataServiceProvider2<UCSEntities> CreateDataSource() { this._dataContext = new MyEntityDataSource(); return new EntityFrameworkDataServiceProvider2<UCSEntities>( new DataServiceProviderArgs(this, this._dataContext, null, false)); } Then add a new property for your data source like this: public MyEntityDataSource CurrentDataSource { get { return this._dataContext; } } This seems to work for me but I am having other issues. I think I'm going to have to revert back to a previous version of my project that doesn't use EF6, there are still too many issues.Anonymous
December 23, 2013
Hi Astoria Team, Any comments on the issues experienced so far? You asked for feedback, you got it. When can we expect a beta release? It's very difficult to do any product planning if we don't know when the stack we want to use will be released as production ready.Anonymous
December 24, 2013
Is IODataRequestMessage documenting? I need to replaced the stream to compress request stream, but i don't know what to do!Anonymous
December 30, 2013
The comment has been removedAnonymous
January 04, 2014
Great news, thanksAnonymous
January 05, 2014
As an alternative to Chris Pomerantz's solution, if you don't want to override CreateDataSource then the CurrentDataSource can also be retrieved via reflection. Details of my solution (effective for the alpha 2 version of the provider) are at stackoverflow.com/.../20896926Anonymous
January 17, 2014
OK, slightly off topic. I've got the 5.6 Data Services nicely exposing my EF6 objects via WCF and it works well, however how do I make the service call asynchronous? Is there an easy way using the new Async and Await keywords or do I need to create callback functions etc... None of my Data Service objects have any Async methods - is there a way to get these created when referencing the service?Anonymous
January 28, 2014
I'd like to second Adrian Hope-Bailie's question. This is also my preferred stack for a product my company is working on, but I'm unwilling to commit to a library that is in alpha and not (apparently) being actively maintained. Is there a roadmap or ETA for future versions of this provider? Or is WCF Web Services no longer a priority?Anonymous
February 10, 2014
Hi, I want to make a veru simple test of that, but It doesn'et works for me. I have VS2013 .net 4.5 EF 6.0. DataService 5.6.0. My project is Webfroms + MVC + NetAPI. I have had package : Install-Package Microsoft.OData.EntityFrameworkProvider -Pre (it's 1.0.0-alpha2) I add a simple test.svc derived like this : public class TOTO1 : EntityFrameworkDataService<TOTOEntities> But when i use url : http://localhost:61542/TOTO1.svc/ , it never goes into InitializeService and say something like: Server as encountered an error while treating demand, see server logs files .... It seems do not like TOTO1.svc.... What's wrong.Anonymous
February 10, 2014
To complete my previous post, John C propose to remove enum, but I've no enums in my very small sample model... So I don't know what to do..Anonymous
February 13, 2014
Guys, I'm tearing my hair out over something that I'm sure is just a simple version mismatch. After editing my service to add EntityFrameworkDataService like this: public class ProductsWcfDataService : EntityFrameworkDataService<AdventureWorksLT2012_AzureEntities> VS2013 is giving me the error, "Error 2 The type or namespace name 'EntityFrameworkDataService' could not be found (are you missing a using directive or an assembly reference?)" I checked my references, and I'm using the following: C:UsersMyDirdocumentsvisual studio2013ProjectsAdventureWorksLTWindowsAzurepackagesEntityFramework.6.1.0-beta1libnet45EntityFramework.dll (failed with the pre-beta version also) C:UsersMyDirdocumentsvisual studio 2013ProjectsAdventureWorksLTWindowsAzurepackagesMicrosoft.Data.Edm.5.6.0libnet40Microsoft.Data.Edm.dll C:UsersMyDirdocumentsvisual studio 2013ProjectsAdventureWorksLTWindowsAzurepackagesMicrosoft.Data.OData.5.6.0libnet40Microsoft.Data.OData.dll C:UsersMyDirdocumentsvisual studio 2013ProjectsAdventureWorksLTWindowsAzurepackagesMicrosoft.Data.Services.5.6.0libnet40Microsoft.Data.Services.dll C:Program FilesMicrosoft WCF Data Services5.6bin.NETFrameworkMicrosoft.Data.Services.Client.dll Am I missing a reference? Or do I have a bad version somewhere? I'm not sure why some of these references are pointing to .NET 40 versions (all updates were made by NuGet) as I have specified 4.5 in the project properties Target framework, but I don't know if that would have any effect anyway. Thanks in advance for any help.