我正在尝试使用WCF OData Services 5.2来发布服务方法,这些方法应该返回派生类型的集合(POCO对象):
public class WcfDataService1 : DataService<MyProvider>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
config.UseVerboseErrors = true;
config.SetServiceActionAccessRule("*", ServiceActionRights.Invoke);
}
[WebGet]
public List<Vehicle> GetStuff()
{
var c = new List<Vehicle>()
{
new Motorbike() {Id = 1},
new Car() {Id = 2}
};
return c;
}
}
public class MyProvider
{
public IQueryable<Car> Cars { get; set; }
public IQueryable<Motorbike> Motorbikes { get; set; }
}
[DataServiceEntity]
[DataServiceKey("Id")]
public abstract class Vehicle
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Motorbike : Vehicle
{
public int MaxSpeed { get; set; }
}
public class Car: Vehicle
{
public int NumberOfTyres { get; set; }
}
我收到以下异常: 服务操作'System.Collections.Generic.List`1 [ODataV3.Vehicle] GetStuff()'生成'ODataV3.Vehicle'类型的实例,但是需要为该类型设置单个实体。
如果我将实体集添加到我的上下文中,则会导致另一个异常: 物业'车辆'和'汽车'是类型'ODataV3.Vehicle'和'ODataV3.Car'和类型'ODataV3.Vehicle'的类型'IQueryable'是'ODataV3.Car'类型的祖先。请确保每个类型层次结构只有一个IQueryable属性。
如果没有服务方法,我会获得具有预期基本类型属性的正确元数据。
有没有办法实现我的GetStuff()方法并拥有所有必需的OData元数据?我试图在基础/继承类型上组合属性,但没有成功。 我不会在WebAPI项目中手动编写元数据(使用其他OData模块进行扩展)。
答案 0 :(得分:2)
目前无法做到这一点。每个实体类型必须只有一个实体集(适用于服务操作,一般不适用,但大多数情况下只适用于自定义提供程序)。在您的情况下,实体类型Vehicle具有两个实体集。
通常,这样的服务将通过返回单个实体集Vehicle(类型为Vehicle)返回所有内容来建模。 在客户端,您可以使用V3类型段功能限制为摩托车:〜/ Vehicles / NS.Motorbike
对于服务器上的特定类型(如果需要),还可以提供可查询的服务操作,然后就像实体集(几乎)一样工作。