カスタムエンティティクラスでWCF Data Services 5.6を使用しており、Catelの ModelBaseから継承するエンティティにデータを正常に読み込んでいます。ただし、挿入または更新を実行しようとすると、Data Service によって使用されるリフレクションが、セッターを持たないインターフェイスを実装する ModelBase の読み取り専用プロパティ「ValidationContext」の 1 つで失敗します。ValidationContext には、Catel 内で定義された [XmlIgnore] 属性と [Browsable(false)] 属性の両方があります。
Configurations.RequestPipeline.OnEntryStarting および OnEntryEnding フックの両方でプロパティを削除しようとしましたが、WritingEntry イベントで xml を編集する(古い学校の) メソッドも使用しました。ただし、これらのイベントのいずれかがトリガーされる前に、以下の例外が発生します。
そのため、Data Services クライアントはシリアル化を試行する前に型を反映しているように見え、IValidationContext をモデル内の有効なエンティティ型として解釈できないため、そこでエラーを吐き出しています。
私がテストに成功した回避策の 1 つは、公開されている ModelBase プロパティを公開されていないバージョンに効果的に置き換えることです。
internal new IValidationContext ValidationContext
{
get { return base.ValidationContext; }
}
しかし、これは明らかに受け入れられません。なぜなら、ValidationContext を他の場所で使用できないからです。
これは、エンティティの対応する部分クラス コードにこのようなプロパティを追加する場合、「サービス参照の追加」によって生成されたプロキシにも問題があると思います。
何かアドバイス?関連する Serializer メソッドのいずれかを置き換える/オーバーライドすることはできますか?
タイプ 'Catel.Data.IValidationContext' には、設定可能なプロパティがありません。ソース: System.Data.Services.Client.ClientEdmModel.GetOrCreateEdmType(Type タイプ) の Microsoft.Data.Services.Client System.Data.Services.Client.Metadata.ClientTypeUtil.TypeIsEntity(Type t、ClientEdmModel モデル) System.Data .Services.Client.ODataPropertyConverter.TryConvertPropertyValue(ClientPropertyAnnotation プロパティ、オブジェクト プロパティ値、HashSet
1 visitedComplexTypeObjects, ODataValue& odataValue) at System.Data.Services.Client.ODataPropertyConverter.PopulateProperties(Object resource, String serverTypeName, IEnumerable
1 プロパティ) System.Data.Services.Client.Serializer.WriteEntry(EntityDescriptor entityDescriptor, IEnumerable`1 relatedLinks, ODataRequestMessageWrapper requestMessage) で System.Data.Services.Client.BaseSaveResult.CreateRequestData(EntityDescriptor entityDescriptor, ODataRequestMessageWrapper requestMessage) で System.Data .Services.Client.BaseSaveResult.CreateChangeData(Int32 インデックス、ODataRequestMessageWrapper requestMessage) System.Data.Services.Client.BatchSaveResult.GenerateBatchRequest()
で System.Data.Services.Client.BatchSaveResult.BatchRequest() で System.Data.Services. System.Data.Services.Client.DataServiceContext.SaveChanges() の Client.DataServiceContext.SaveChanges(SaveChangesOptions オプション)