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

标签 .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”类型的实例,但需要为该类型设置一个实体。

如果我将实体集添加到上下文中,则会导致不同的异常: 属性“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/

相关文章:

c++ - 轻型 SQL 数据库

.net - F# 4.0.0.0 到 4.3.0.0 的系统范围 bindingRedirect

c# - WCF - 地址过滤器不匹配

jquery - 代码可以与 Postman 一起使用,但不能在 localhost Ajax 上使用

c# - 用于 Android 或 Java 和 WCF 的单声道

C++ 未定义的抽象类构造函数

java - 在 Java 中处理具体类型时 instanceof 的替代方法

.NET应用Mysql远程数据库同步

wcf - 使用 webMessageEncoding 的 webHttpBinding : how to configure?

带有泛型的 Java 工厂模式