WCF OData 服务和 EF 6 问题 - 无法使用 Odata 服务公开实体

2023-12-30

我将 WCF 数据服务 (Odata) 与 .NET Framework 4.5.1 和 EF 6.1 结合使用。我使用代码优先方法来创建 EF 模型。当我将此 EF 模型 (AddProjectModel.cs) 引用到 WCF OData 服务 (WcfDataService1.svc) 时,它会引发以下错误:

Error:

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

在System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata(ProviderMetadataCacheItemmetadataCacheItem)在System.Data.Services.Providers.BaseServiceProvider.LoadMetadata(布尔skipServiceOperations)在System.Data.Services.DataService1.CreateInternalProvider(Object dataSourceInstance) at System.Data.Services.DataService1.CreateMetadataAndQueryProviders(IDataServiceMetadataProvider&metadataProviderInstance,IDataServiceQueryProvider&queryProviderInstance,Object&dataSourceInstance,Boolean&isInternallyCreatedProvider)在System.Data.Services.DataService1.CreateProvider() at System.Data.Services.DataService1.HandleRequest() 在 System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody) 在 SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] ) 在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[ ] 输入,Object[]& 输出)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) )在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc&rpc)在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(Boolean isOperationContextSet)

这是我的 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;
    }
 }
}

我的代码优先模型: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));
 }
}

资产类别:

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; }   
}

我不知道如何解决这个问题。你能告诉我我在这里缺少什么吗?

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

Thanks,


Hi,

我通过在每个 POCO 类上设置带有主键的 [DataServiceKey] 属性解决了此错误。请参考这个:http://blog.marcgravell.com/2008/12/astoria-and-linq-to-sql-getting-started.html http://blog.marcgravell.com/2008/12/astoria-and-linq-to-sql-getting-started.html.

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

Error:

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

我该如何解决这个问题?

Thanks,


要将 WCF DataService 与 EF6 一起使用,需要做一些额外的工作。详细请查看以下两篇博文:

将 WCF 数据服务 5.6.0 与实体框架 6+ 结合使用 http://blogs.msdn.com/b/odatateam/archive/2013/10/02/using-wcf-data-services-5-6-0-with-entity-framework-6.aspx

WCF 数据服务实体框架提供程序已更新为 WCF 数据服务 5.6.2 http://blogs.msdn.com/b/odatateam/archive/2014/08/18/wcf-data-services-entity-framework-provider-is-updated-with-wcf-data-service-5-6-2.aspx

一般来说,您需要执行以下两个步骤:

  1. 安装最新的 Nuget 包Microsoft.OData.EntityFrameworkProvider http://www.nuget.org/packages/Microsoft.OData.EntityFrameworkProvider/1.0.0-beta2遵循该页面上的指南;
  2. 将 DataService 替换为 EntityFrameworkDataService,例如在 WcfDataService1.svc 中:

    公共类 WcfDataService1 :EntityFrameworkDataService

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF OData 服务和 EF 6 问题 - 无法使用 Odata 服务公开实体 的相关文章

  • ADO.NET 池连接无法重用

    我正在开发一个 ASP NET MVC 应用程序 该应用程序使用 EF 6 x 来处理我的 Azure SDL 数据库 最近 随着负载的增加 应用程序开始进入无法再与 SQL 服务器通信的状态 我可以看到有 100 个到我的数据库的活动连接
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • OData 实体属性序列化名称与 C# 变量名称不同

    在使用 OData 的 ASP NET Web API 中 我有一个 C 对象 描述允许在 filter 中使用的字段 说我想限制 filter支持仅 filter deviceId gt someValue 随后http www ben
  • 如何从互联网访问本地网络内的服务器

    假设我有一个服务器应用程序在未直接连接到互联网但通过路由器连接的计算机上工作 所以问题是如何从不在内部网络 从互联网 内的另一台计算机连接到该服务器 据我所知 管理员可以配置路由器将指定端口请求重定向到该计算机 但我可以自动执行此操作吗 我
  • 如何计算关联实体而不在实体框架中获取它们

    我想知道这个问题已经有一段时间了 所以我认为值得使用我的第一篇 Stack Overflow 帖子来询问它 想象一下我正在与关联的消息列表进行讨论 DiscussionCategory discussionCategory reposito
  • IOptions 不包含 ASP.NET 5 Beta 8 中的定义“选项”

    Problem 我在将 beta7 应用程序升级到 beta8 时遇到问题 我最初有超过 50 个错误 但现在基本上只剩下两个我无法解决的持续错误 一种是带有选项 选项缺失错误 这是错误 错误 CS1061 IOptions 不包含 Opt
  • 如何在 C# 中向肥皂信封添加命名空间

    我想向我的肥皂信封添加命名空间设置 我想在 IClientMessageInspector 的 BeforeSendRequest 中更改它 或者您有更优雅的方法 例如
  • LINQ to Entities 无法识别“Int32 IndexOf(System.String, System.StringComparison)”方法

    我已经使用 Entityframework 执行了 linq 查询 如下所示 GroupMaster getGroup null getGroup DataContext Groups FirstOrDefault item gt keyw
  • 如果我使用带有表单身份验证的 WCF,php 或 java 客户端将如何进行身份验证?

    我有一个通用的概念验证 WCF 服务 它使用表单身份验证来保护访问 当我的客户端是 NET 时 一切都很好 vb 代码如下 Dim client As SupplierServiceClient New SupplierServiceCli
  • “反序列化操作回复消息正文时出错...” - 对于我调用的每个方法

    我正在尝试为我们的波兰拍卖服务 Allegro 创建非常简单的客户端应用程序 他们提供 SOAP 架构中的 API 问题是 每次我尝试调用任何方法时 我都会收到 反序列化操作 方法名称 的回复消息正文时出错 一般来说 我对网络服务不熟悉 所
  • 实体框架底层提供程序在打开时失败

    下面是我的连接字符串 connectionString 元数据 res EDMX Test csdl res EDMX Test ssdl res EDMX Test msl provider System Data SqlClient p
  • Task.Delay 值得取消吗?

    我最近使用取消模式重新实现了一大堆异步 WCF 服务方法 我在很多地方都看到过这种模式的描述 您可以在其中等待Task WhenAny在已启动的任务和 Task Delay 上 当然 现有任务是不可取消的 但这有望在以后的版本中得到解决 就
  • 双工服务的实例、会话和并发

    我有一个要求 服务应该每秒向客户端发送一条消息 该服务只能有一个客户端 我创建了一个双工服务 现在对该服务的实例 并发性和会话感到困惑 双工服务是否始终需要会话 会话模式 必需 InstanceContextMode 是否应始终为 PerS
  • 如何从Windows服务公开restful接口?

    我编写了一个公开restful接口的wcf服务 现在我使用iis作为wcf服务主机 除了暴露其余部分之外 我还需要对我的应用程序执行一些操作 为此 我必须将我的应用程序作为 Windows 服务运行 但是使用iis作为主机不会使我的wcf服
  • 使用实体框架创建临时表

    我想使用实体框架在 SQL Server 中创建临时表 我有什么办法可以做到这一点吗 如果我可以创建临时表 我的下一个问题是 如何读取它 提前致谢 Andr 好吧 所以你不喜欢存储过程路线 说实话我也不喜欢 但这是我能想到的最快的方法 基于
  • 如何在 EF 查询中使用函数参数化选择器?

    我有一个传递给的投影函数IQueryable lt gt Select method private static Expression
  • WCF 自定义序列化器

    我正在 WCF 中创建一个返回 JSON 的 Web 服务 但 DataContractJsonSerializer 对某些循环引用犹豫不决 在这种特殊情况下我无法删除这些引用 相反 我想使用 Newtonsoft json 库 在 WCF
  • MSMQ、WCF 和 Flaky 服务器

    我有两个应用程序 我们称它们为 A 和 B 当前 A 使用 WCF 向 B 发送消息 A 不需要响应 B 也从不将消息发送回 A 不幸的是 运行的服务器 A 和 B 之间的网络连接不稳定 这导致 A 时不时地出现超时错误 我想使用 WCF
  • 实体框架POCO与WCF软件设计问题

    我将在我的应用程序中使用实体框架和 WCF 正如我所看到的 建议的做法是将 POCO 与实体框架结合使用 并使用 POCO 类作为 DataContracts 如果我没记错的话 这实际上就是 POCO 和属性的用途 但是 我被要求对 Ent
  • 实体框架中的多态性

    具体类 BankAccount and CreditCard 在控制器上不可见 我被这个问题困扰了 我正在使用该网站的示例 http weblogs asp net manavi archive 2010 12 28 inheritance

随机推荐