我正在尝试使用 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”类型的 IQueryable,而“ODataV3.Vehicle”类型是祖先对于“ODataV3.Car”类型。请确保每个类型层次结构只有一个 IQueryable 属性。
如果没有服务方法,我将获得具有预期基本类型属性的正确元数据。
有什么方法可以实现我的 GetStuff() 方法并拥有所有必要的 OData 元数据?我试图结合基本/继承类型的属性,但没有成功。我不会在 WebAPI 项目中手动编写元数据(使用额外的 OData 模块进行扩展)。