.net 具有不变类型集合的WCF OData服务方法
我正在尝试使用WCF OData Services 5.2发布服务方法,该方法应返回派生类型(POCO对象)的集合:.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
公共类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; }
}