WCF OData Service and EF 6 - Unable to Expose Objects Using Odata Service

I am using WCF data service (Odata) with .NET framework 4.5.1 and EF 6.1. I used the first code approach to create an EF model. When I reference this EF model (AddProjectModel.cs) to the WCF OData service (WcfDataService1.svc), it causes the following error:

Mistake:

The server encountered an error processing the request. Exception message: “In the context of the“ AddProjectModel ”data context, there is an IQueryable“ Assets ”top property whose element type is not an entity type. Make sure the IQueryable property is an entity type or points the IgnoreProperties attribute to the data context type to ignore this property. '. For more information, see Server Logs. Exception stack trace:

in System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata (ProviderMetadataCacheItem metadataCacheItem) in System.Data.Services.Providers.BaseServiceProvider.LoadMetadata (Boolean skipServiceOperations) in System.DataIntervice.Derm.Service.Dervice.Derm 1.CreateInternalProvider(Object dataSourceInstance) at System.Data.Services.DataService 1.CreateMetadataAndQueryProviders (IDataServiceMetadataProvider & metadataProviderInstance, IDataServiceQueryProvider & queryProviderInstance, object & dataSourceInstance, Boolean & isate.Der.SerateDer.Serate.Der.Service.Der.Ser ) in System.Data.Services.DataService`1.ProcessRequestForMessage (messageBody stream) in SyncInvokeProcessRequestForMessage (Object, Object [], Object []) in System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Object instance, Object [] inputs, Object [] and exits) in System.ServiceM odel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.pispMesspermessperpermpermpermessppcessmesspremeppcessmesspremeppermpermpermpermpermpermpresspermpermpermprecesspermesspermesspermesspermesspermpermpermpresspermperm .ProcessMessage4 (MessageRpc & rpc) in System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & rpc) in System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & rpc) on the system. ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & rpc) in System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & rpc) in System.ServiceModel.Dispatcher.ImmutableDispatchResspermagepermagepentmeppmepeperpentmeppermpeperpermpeperpermpeperpentmepispimeppemeppermeppremeppermeppremeppermeppremeppremeppremeppermeppremeppermeppremeppermeppentmeppremeppermeppimeperm .Process (Boolean isOperationContextSet)

Here is my WCF data service: WcfDataService1.svc

 namespace AddProjectService { public class WcfDataService1 : DataService<AddProjectModel> { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. // Examples: config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3; } } } 

My first code model: AddProjectModel.cs

  public partial class AddProjectModel : DbContext { public AddProjectModel() : base("name=AddProjectModel") { } public virtual DbSet<Asset> Assets { get; set; } public virtual DbSet<Project> Projects { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new AssetMap()); modelBuilder.Configurations.Add(new ProjectMap()); } } public class AssetMap : EntityTypeConfiguration<Asset> { public AssetMap() { this.Property(a => a.AssetId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.HasMany(a => a.Projects).WithRequired(p => p.Asset).HasForeignKey(p => p.AssetId); //table & column mappings this.ToTable("TBLASSET"); this.Property(a => a.AssetId).HasColumnName("ASSETID"); this.Property(a => a.AssetLevelId).HasColumnName("ASSETLEVELID"); this.Property(a => a.AssetNumber).HasColumnName("ASSETNUMBER"); this.Property(a => a.Name).HasColumnName("NAME"); this.Property(a => a.AssetTypeId).HasColumnName("ASSETTYPEID"); } } public class ProjectMap : EntityTypeConfiguration<Project> { public ProjectMap() { this.Property(p => p.ProjectId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.HasMany(p => p.SchedulePhases).WithRequired(sp => sp.Project).HasForeignKey(sp => sp.ProjectId); //table & column mappings this.ToTable("TBLPROJECT"); this.Property(p => p.ProjectId).HasColumnName("PROJECTID"); this.Property(p => p.AssetId).HasColumnName("ASSETID"); this.Property(p => p.CapitalCategoryId).HasColumnName("CAPITALCATEGORYID"); this.Property(p => p.Comments).HasColumnName("COMMENTS"); this.Property(p => p.DesignationId).HasColumnName("DESIGNATIONID"); this.Property(p => p.DispositionId).HasColumnName("DISPOSITIONID"); this.Property(p => p.FMSNumber).HasColumnName("FMSNUMBER"); this.Property(p => p.FundingSourceId).HasColumnName("FUNDINGSOURCEID"); this.Property(p => p.ImplementerId).HasColumnName("IMPLEMENTERID"); this.Property(p => p.IsApproved).HasColumnName("ISAPPROVED"); this.Property(p => p.IsDeferred).HasColumnName("ISDEFERRED"); this.Property(p => p.IsLongTermLease).HasColumnName("ISLONGTERMLEASE"); this.Property(p => p.IsRollover).HasColumnName("ISROLLOVER"); this.Property(p => p.IsSidewalkBridge).HasColumnName("ISSIDEWALKBRIDGE"); this.Property(p => p.JobDescription).HasColumnName("JOBDESCRIPTION"); this.Property(p => p.JobType).HasColumnName("JOBTYPE"); this.Property(p => p.OrganizationId).HasColumnName("ORGANIZATIONID"); this.Property(p => p.ProgramCategoryId).HasColumnName("PROGRAMCATEGORYID"); this.Property(p => p.DsfId).HasColumnName("DSFID"); this.Property(p => p.StatusId).HasColumnName("STATUSID"); this.Map<DomainObjectModel.ObjectModel.Project.ProjectCIP>(m => m.Requires("PROJECTTYPEID").HasValue(15)) .Map<DomainObjectModel.ObjectModel.Project.ProjectCapacity>(m => m.Requires("PROJECTTYPEID").HasValue(2)); } } 

Asset class:

 public class Asset { public Asset() { Projects = new HashSet<Project>(); } [Key] public decimal AssetId { get; set; } [StringLength(20)] public string AssetNumber { get; set; } [StringLength(100)] public string Name { get; set; } public decimal? AssetLevelId { get; set; } public decimal? AssetTypeId { get; set; } public virtual ICollection<Project> Projects { get; set; } } 

Project Class:

 public class Project { public Project() { } [Key] public decimal ProjectId { get; set; } public decimal AssetId { get; set; } public decimal CapitalCategoryId { get; set; } //public decimal ProjectTypeId { get; set; } public decimal ProgramCategoryId { get; set; } [StringLength(1024)] public string Comments { get; set; } public decimal ImplementerId { get; set; } public decimal StatusId { get; set; } public decimal DsfId { get; set; } [StringLength(20)] public string FMSNumber { get; set; } [StringLength(1024)] public string JobDescription { get; set; } [StringLength(2)] public string JobType { get; set; } public decimal OrganizationId { get; set; } [Required][StringLength(1)] public string IsRollover { get; set; } [Required][StringLength(1)] public string IsDeferred { get; set; } [Required][StringLength(1)] public string IsApproved { get; set; } [StringLength(1)] public string IsSidewalkBridge { get; set; } public decimal FundingSourceId { get; set; } public decimal? DesignationId { get; set; } public decimal? DispositionId { get; set; } [Required][StringLength(1)] public string IsLongTermLease { get; set; } public virtual Asset Asset { get; set; } } 

I do not know how to solve this problem. Could you tell me what I am missing here?

I use the oracle database, and recently we purchased a license from devart for dotConnect for oracle.

Thanks,


Hi,

I resolved this error by setting the [DataServiceKey] attribute with the primary key on each POCO class. See This: http://blog.marcgravell.com/2008/12/astoria-and-linq-to-sql-getting-started.html .

Now I can expose entities through the Odata service, but when I try to access the entity collection by typing a URL (for example ... / WcfDataService1.svc / Assets), it gives the following error:

Mistake:

  <?xml version="1.0" encoding="utf-8" ?> <m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <m:code /> <m:message xml:lang="en-US">An error occurred while processing this request.</m:message> <m:innererror> <m:message>Operation could destabilize the runtime.</m:message> <m:type>System.Security.VerificationException</m:type> <m:stacktrace>at queryable_reader(Object ) at System.Data.Services.Providers.ReflectionServiceProvider.GetQueryRootForResourceSet(ResourceSet container) at System.Data.Services.Providers.ReflectionDataServiceProvider.GetQueryRootForResourceSet(ResourceSet resourceSet) at System.Data.Services.Providers.DataServiceProviderWrapper.GetQueryRootForResourceSet(ResourceSetWrapper resourceSet) at System.Data.Services.RequestUriProcessor.ComposeExpressionForEntitySet(SegmentInfo segment, IDataService service, Boolean isLastSegment, Boolean checkRights) at System.Data.Services.RequestUriProcessor.ComposeExpressionForSegments(IList`1 segments, IDataService service, Boolean isCrossReferencingUri) at System.Data.Services.RequestUriProcessor.ProcessRequestUri(Uri absoluteRequestUri, IDataService service, Boolean internalQuery) at System.Data.Services.DataService`1.ProcessIncomingRequestUri() at System.Data.Services.DataService`1.HandleRequest()</m:stacktrace> </m:innererror> </m:error> 

How to resolve this?

Thanks,

+8
odata entity-framework wcf
source share
1 answer

To use WCF DataService with EF6, you need to do extra work. Please check the following two blog entries:

Using WCF Data Services 5.6.0 with Entity Framework 6+

WCF Services Entity Framework Provider Updated Using WCF 5.6.2 Data Service

In general, you will need the following two steps:

  • Install the latest Nuget package Microsoft.OData.EntityFrameworkProvider according to the manual on this page;
  • Replace DataService with EntityFrameworkDataService, say in your WcfDataService1.svc:

    public class WcfDataService1: EntityFrameworkDataService

+33
source share

All Articles