2

我正在尝试使用 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 模块进行扩展)。

4

1 回答 1

2

目前这是不可能的。每种实体类型必须只有一个实体集(适用于服务操作,一般不适用,但大多数情况下只有自定义提供程序才有可能)。在您的情况下,实体类型 Vehicle 有两个实体集。

通常,此类服务将通过返回单个实体集 Vehicles(类型为 Vehicle)来建模,该实体集返回所有内容。在客户端上,您可以使用 V3 类型段功能限制摩托车:~/Vehicles/NS.Motorbike

还可以为服务器上的特定类型(如果需要)提供可查询的服务操作,然后(几乎)像实体集一样工作。

于 2013-01-04T16:55:24.553 回答