.net 具有不变类型集合的WCF OData服务方法

.net 具有不变类型集合的WCF OData服务方法,.net,wcf,inheritance,wcf-data-services,odata,.net,Wcf,Inheritance,Wcf Data Services,Odata,我正在尝试使用WCF OData Services 5.2发布服务方法,该方法应返回派生类型(POCO对象)的集合: 公共类WcfDataService1:DataService { 公共静态void InitializeService(DataServiceConfiguration配置) { config.SetEntitySetAccessRule(“*”,EntitySetRights.All); config.SetServiceOperationAccessRule(“*”,Serv

我正在尝试使用WCF OData Services 5.2发布服务方法,该方法应返回派生类型(POCO对象)的集合:

公共类WcfDataService1:DataService
{
公共静态void InitializeService(DataServiceConfiguration配置)
{
config.SetEntitySetAccessRule(“*”,EntitySetRights.All);
config.SetServiceOperationAccessRule(“*”,ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion=DataServiceProtocolVersion.V3;
config.UseVerboseErrors=true;
config.SetServiceActionAccessRule(“*”,ServiceActionRights.Invoke);
}
[WebGet]
公共列表GetStuff()
{
var c=新列表()
{
新摩托车(){Id=1},
新车(){Id=2}
};
返回c;
}
}
公共类MyProvider
{
公共可通行汽车{get;set;}
公共可更换摩托车{get;set;}
}
[数据服务实体]
[数据服务密钥(“Id”)]
公共抽象类车辆
{
公共int Id{get;set;}
公共字符串名称{get;set;}
} 
公共级摩托车:汽车
{
public int MaxSpeed{get;set;}
} 
公营车辆
{
公共整数{get;set;}
}
我收到以下例外情况: 服务操作“System.Collections.Generic.List`1[ODataV3.Vehicle]GetStuff()”生成类型为“ODataV3.Vehicle”的实例,但需要为该类型设置单个实体

如果将实体集添加到上下文中,则会导致不同的异常: 属性“Vehicles”和“Cars”可分为“ODataV3.Vehicle”和“ODataV3.Car”两种类型,类型“ODataV3.vehicler”是类型“ODataV3.Car”的祖先。请确保每个类型层次结构只有一个IQueryable属性

如果没有服务方法,我将获得具有预期basetype属性的正确元数据

有没有办法实现我的GetStuff()方法并拥有所有必需的OData元数据?我尝试将基本/继承类型上的属性组合在一起,但没有成功。
我不会在WebAPI项目(通过附加OData模块扩展)中手动编写元数据

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

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


还可以为服务器上的特定类型(如果需要的话)提供可查询的服务操作,这些操作与实体集(几乎)类似。

我没有注意到我在WebAPI OData 0.2.0 alpha()中看到了WebAPI模型绑定器API,我将使用WCF数据服务感谢您的解释!
    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; }
    }