【问题标题】:How to create WCF Data Service on a base type如何在基本类型上创建 WCF 数据服务
【发布时间】:2011-07-28 13:34:24
【问题描述】:

我正在尝试做这样的事情:

public class DataService : DataService<EmployeeCollection>
{
  public IQueryable<EmployeeBase> GetEmployeeData(string EmpIdSubstring)
  {
    var employees = new List<EmployeeBase>();
    employees.Add(new Level1Employee());
    employees.Add(new Level2Employee());
    return employees.AsQueryable();
  }
}

这里:

  1. Level1EmployeeLevel2Employee 类派生自 EmployeeBase 类。
  2. EmployeeBase 类定义用[DataServiceKey("Id")] 修饰。
  3. EmployeeCollection 包含一个 IEnumerable&lt;EmployeeBase&gt;

但是当我在浏览器中浏览该服务时,出现以下错误:

内部服务器错误。 'Level1Employee' 类型不是复杂类型或实体类型。

我尝试将[DataServiceKey] 属性从EmployeeBase 类移动到Level1EmployeeLevel2Employee 类定义。但得到同样的错误。

请注意,如果我返回包含 EmployeeBase 类型元素的员工集合,则该服务可以正常工作。

有可能实现吗?非常感谢任何帮助/指示/见解。

【问题讨论】:

  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!如果您发布错误消息,使用块引号 (` " ` ) 正确格式化错误消息。

标签: c# wcf exception-handling wcf-data-services odata


【解决方案1】:

这是基于 RIA 服务中的 DomainServices 行为在黑暗中拍摄的。

尝试为每个子类添加一个函数。 IQueryable&lt;Level1Employee&gt;IQueryable&lt;Level2Employee&gt;.各返回一个

【讨论】:

  • 这对我不起作用,因为 EmployeeCollection 类型的单个集合可能包含 Level1Employee 和 Level2Employee 类型的元素。
  • 是的,您实际上不必使用这些功能。我看到了“OData”标签,认为您正在使用 OData 工具,如果它们与 RIA 服务工具类似,那么拥有这些功能将允许 OData 服务显示类。此时,RIA 服务不会知道它们的存在。
【解决方案2】:

上下文类(在您的情况下为 EmployeeCollection)必须公开一个带有 getter 和 IQueryable 类型的公共属性,并且 EmployeeBase 类必须具有 DataServiceKey 属性,以便将 EmployeeBase(及其所有派生类型)识别为实体类型。 您还需要在方法上添加 [WebGet] 属性,以便将其识别为服务操作。

【讨论】:

  • 嗨 Vitek,1. EmployeeCollection 有一个公共 getter 属性,其返回类型为 IQueryable。 2. EmployeeBase 类有一个DataServiceKey 属性,以“Id”为键。 3. [WebGet] 属性也已到位。还是不行。
  • “不工作”意味着您收到问题中描述的错误? Level1Employee 是公共类吗?如果可能的话,你能发布它的定义吗?无论如何,如果您可以在调试器中捕获异常并发布堆栈跟踪,那也会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多