Entity framework WCF OData服务和EF 6问题-Can和x27;t使用Odata服务公开实体

Entity framework WCF OData服务和EF 6问题-Can和x27;t使用Odata服务公开实体,entity-framework,wcf,odata,Entity Framework,Wcf,Odata,我正在将WCF数据服务(Odata)与.NETFramework 4.5.1和EF6.1一起使用。我使用了代码优先的方法来创建EF模型。当我将此EF模型(AddProjectModel.cs)引用到WCF OData服务(WcfDataService1.svc)时,它抛出以下错误: 错误: 服务器在处理请求时遇到错误。异常消息为“在数据上下文类型“AddProjectModel”上”,有一个顶级IQueryable属性“Assets”,其元素类型不是实体类型。确保IQueryable属性为实体类

我正在将WCF数据服务(Odata)与.NETFramework 4.5.1和EF6.1一起使用。我使用了代码优先的方法来创建EF模型。当我将此EF模型(AddProjectModel.cs)引用到WCF OData服务(WcfDataService1.svc)时,它抛出以下错误:

错误:

服务器在处理请求时遇到错误。异常消息为“在数据上下文类型“AddProjectModel”上”,有一个顶级IQueryable属性“Assets”,其元素类型不是实体类型。确保IQueryable属性为实体类型,或指定数据上下文类型上的IgnoreProperties属性以忽略此属性。“。有关详细信息,请参阅服务器日志。异常堆栈跟踪为:

位于System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata(ProviderMetadataCacheItem metadataCacheItem)的System.Data.Services.Providers.BaseServiceProvider.LoadMetadata(布尔skipServiceOperations)的System.Data.Services.DataService
1.CreateInternalProvider(对象数据源实例)在System.Data.Services.DataService
1.CreateMataAndQueryProviders(IDataServiceMetadataProvider&metadataProviderInstance,IDataServiceQueryProvider&queryProviderInstance,Object&dataSourceInstance,Boolean&isInternallyCreatedProvider)的System.Data.Services.DataService
1.CreateProvider()在System.Data.Services.DataService处的System.Data.Services.DataService处的System.Data.Services.DataService处的System.HandlerRequest()处的
1.ProcessRequestFormMessage(Stream messageBody)处的SyncInvokeProcessRequestFormMessage(Object,Object[],Object[])处的System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoker(Object实例,Object[]输入,Object[]输出)在System.ServiceModel.Dispatcher.Dispatcher.DispatcheOperationRuntime.InvokeBegin(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage5(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage4在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&rpc)在System.ServiceModel.Dispatcher.MessageRpc.Process(布尔等操作上下文集)

这是我的WCF数据服务: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;
    }
 }
}
我不知道如何解决这个问题。你能告诉我我这里缺少什么吗

我正在使用oracle数据库,最近我们从devart购买了oracle dotConnect的许可证

谢谢


我已通过在每个POCO类上设置具有主键的[DataServiceKey]属性来解决此错误。请参阅:

现在我可以通过Odata服务公开实体,但当我尝试通过键入URL(例如..../WcfDataService1.svc/Assets)访问实体集合时,它会引发以下错误:

错误:

 <?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>

处理此请求时出错。
操作可能会使运行时不稳定。
System.Security.VerificationException异常
位于System.Data.Services.Providers.ReflectionServiceProvider.GetQueryRootForResourceSet(ResourceSet容器)的System.Data.Services.Providers.ReflectionDataServiceProvider.GetQueryRootForResourceSet(ResourceSet ResourceSet)的System.Data.Services.Providers.DataServiceProviders.GetQueryRootForResourceSet(ResourceSet ResourceSet ResourceSet)的queryable\u阅读器(对象)(ResourceSetWrapper resourceSet)位于System.Data.Services.RequestUriProcessor.ComposeExpressionForEntitySet(SegmentInfo段、IDataService服务、Boolean isLastSegment、Boolean checkRights),位于System.Data.Services.RequestUriProcessor.ComposeExpressionForSegments(IList`1段、IDataService服务、Boolean IsCrossReferenceGuri)System.Data.Services.DataService`1.ProcessIncomingRequestUri()位于System.Data.Services.DataService`1.ProcessIncomingRequestUri()处System.Data.Services.DataService`1.HandlerRequest()处的System.Data.Services.RequestUri.ProcessRequestUri(Uri absoluteRequestUri,IDataService service,Boolean internalQuery)
我如何解决这个问题


谢谢,

要在EF6中使用WCF DataService,还有一些额外的工作要做。有关详细信息,请查看以下两篇博文:

通常,您需要执行以下两个步骤:

  • 按照该页面上的指南安装最新的Nuget软件包
  • 将DataService替换为EntityFrameworkDataService,例如在WcfDataService1.svc中:

    公共类WcfDataService1:EntityFrameworkDataService


  • 我花了6个小时才找到这个。
    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; }    
    }
    
    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; }   
    }
    
     <?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>