2

OData クライアント ジェネレーターを使用して OData v4 クライアントを作成しました。これにより、部分クラスが生成されました。この生成されたクラスをIDataErrorInfoで拡張したいと思います。

namespace Client.Model {
    public partial class City : IDataErrorInfo
    {
        public String this[String columnName]
        {
            return "";
        }

        public String Error { get { return ""; } }
    }
}

新しい都市を作成してサーバーに送信したい場合

ODataContainer container = new ODataContainer(new Uri("http://localhost:45666/odata"));
container.AddToCities(city);

エラーが発生する

An exception of type 'Microsoft.OData.Client.DataServiceRequestException' occurred in Microsoft.OData.Client.dll.

The request is invalid. The property "Error" does not exist in Server.Model.City.

WebApi 構成:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<City>("Cities");
        builder.EntitySet<Country>("Countries");

        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: "odata",
            model: builder.GetEdmModel());
    }
}

Errorプロパティがリクエストに含まれないようにする可能性はありますか?

4

3 に答える 3

0

OData クライアントで生成されたモデルは部分クラスです。を実装すると、もちろんサーバー側には存在しないプロパティをIDataErrorInfo実装するように求められます。Errorたとえばエンティティに対して操作を行うため、Cityこれは City オブジェクトをシリアル化し、Error プロパティがある場合はそれもシリアル化されます。

解決策として、この状況を回避し、クライアント モデルを UI から分離しておくことが考えられます。これを試すことができます:

namespace Client.Model {
    public partial class City
    {
        public String this[String columnName]
        {
            return "";
        }
    }
}

継承を使用して、生成されたものとは別に、UI 関連のモデル クラスを作成します。

namespace UI.Model {
    public class City : Client.Model.City, IDataErrorInfo
    {
        public String Error { get { return ""; } }
    }
}

UI で UI.Model.City を使用していることを確認し、追加操作のために OData サービスを呼び出す場合は、UI.Model.City クラス オブジェクトで明示的なキャストを実行して Client.Model.City に変換すると、Error プロパティはなくなります。 :

ODataContainer container = new ODataContainer(new Uri("http://localhost:45666/odata"));
container.AddToCities((Client.Model.City)city);

注:このアプローチには独自の短所があります。異なる名前空間で同じクラス名を持つ可能性があるため、同じクラス名を使用する場合は完全な名前空間パスを使用する必要があることがよくあります。UIモデルのクラス名に異なる接頭辞/接尾辞を使用することで回避できます。例えばCityViewModel

于 2015-07-17T20:40:01.953 に答える
0

おそらく、OData クライアント フックが要件を満たすことができます。関連する質問を参照してください ( oData クライアントの動的プロパティを扱う)

于 2015-07-20T08:14:33.590 に答える