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プロパティが1つしかないことを確認してください。
serviceメソッドがないと、期待されるベースタイプ属性を持つ正しいメタデータを取得できます。
GetStuff()メソッドを実装し、必要なすべてのODataメタデータを取得する方法はありますか?ベース/継承タイプの属性を組み合わせようとしましたが、成功しませんでした。WebAPIプロジェクト(追加のODataモジュールで拡張)にメタデータを手動で書き込むことはしません。