2

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モジュールで拡張)にメタデータを手動で書き込むことはしません。

4

1 に答える 1

2

現在、これは不可能です。各エンティティタイプには、エンティティセットが1つだけ含まれている必要があります(サービス操作に適用され、一般には適用されませんが、ほとんどの場合、カスタムプロバイダーでのみ可能です)。あなたの場合、エンティティタイプVehicleには2つのエンティティセットがあります。

通常、このようなサービスは、すべてを返す単一のエンティティセットVehicles(タイプVehicle)を返すことによってモデル化されます。クライアントでは、V3タイプのセグメント機能を使用してモーターバイクに制限できます:〜/ Vehicles / NS.Motorbike

サーバー上の特定のタイプ(必要な場合)に対して、エンティティセットのように(ほぼ)機能するクエリ可能なサービス操作を提供することもできます。

于 2013-01-04T16:55:24.553 に答える