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

时间:2013-01-04 16:08:35

标签: .net wcf inheritance wcf-data-services odata

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

1 个答案:

答案 0 :(得分:2)

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

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

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