我正在尝试使用 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”类型的实例,但需要为该类型设置一个实体。
如果我将实体集添加到上下文中,则会导致不同的异常: 属性“Vehicles”和“Cars”是类型“ODataV3.Vehicle”和“ODataV3.Car”的 IQueryable,并且类型“ODataV3.Vehicle”是类型“ODataV3.Car”的祖先。请确保每种类型层次结构只有一个 IQueryable 属性。
如果没有服务方法,我会获得具有预期基本类型属性的正确元数据。
有没有办法实现我的 GetStuff() 方法并拥有所有必要的 OData 元数据?我尝试组合基本/继承类型的属性,但没有成功。 我不会在 WebAPI 项目(使用其他 OData 模块扩展)中手动编写元数据。
最佳答案
目前这是不可能的。每种实体类型必须具有一个实体集(适用于服务操作,不适用于一般情况,但大多数情况下只能通过自定义提供程序实现)。在您的情况下,实体类型 Vehicle 有两个实体集。
通常,此类服务将通过返回单个实体集 Vehicles(车辆类型)来建模,该实体集返回所有内容。 在客户端上,您可以使用 V3 类型分段功能限制摩托车:~/Vehicles/NS.Motorbike
还可以提供可查询的服务操作,然后针对服务器上的特定类型(如果需要),这些操作就像实体集(几乎)一样。
关于.net - 具有不变类型集合的 WCF OData 服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160616/