4

MVC 5 の新しい Web API で OData サービスを使用していますが、問題が発生しています。

このチュートリアルに従ってOData サービスの開発を開始しましたが、ほとんどすべてが正しいです。プロジェクトがビルドされ、ルートが機能し、URL がうまく機能しています。

私のクラスの 1 つが呼び出され、次のように名前付きPostの型のプロパティがあります。Dictionary<string, object>Parameters

public partial class Post : IPost
{
    public Guid Id { get; set; }

    public string Author{ get; set; }  
    public string Content{ get; set; }  
    public DateTime PostedDate{ get; set; }  
    public List<Photo> Pictures { get; set; }  

    public Dictionary<string, object> Parameters { get; set; }  
}

Postすべてのオブジェクト ( )を一覧表示する URLhttp://localhost/odata/Postsは、ブラウザーで get 要求を実行すると正常に機能します。すべてのオブジェクトが正常にシリアル化されます。

しかし、別のアプリケーションで OData メタデータをサービス参照としてインポートすると、Postエンティティのリストを取得すると、次のエラーが表示されます。

タイプ 'System.InvalidOperationException' の例外が Microsoft.Data.OData.dll で発生しましたが、ユーザー コードでは処理されませんでした

追加情報: タイプ 'WebApplication1.ServiceReference2.System.Collections.Generic.KeyValuePair_2OfString_Object' には設定可能なプロパティがありません。

この問題を解決してサービス参照を正常にインポートするにはどうすればよいですか?

4

3 に答える 3

9

数日後、私は多くの異なるテストを試みました。

  • Dictionary<string, object>=>元のエラーをスローします
  • Dictionary<string, string>=>同じエラー
  • List<KeyValuePair<string, object>>=>同じエラー
  • List<KeyValuePair<string, string>>=>同じエラー

クラスに問題があることに気づきましたKeyValuePairが、その理由はわかりませんでした。

そこで、Parameter以下のような名前のクラスを作成しました。

public class Parameter
{
    public string Key { get; set; }
    public string Value { get; set; }
}

...リストの種類をに変更したList<Parameter>ところ、うまくいきました!

この問題についてさらに考えてみたところ、エラーの中にある重要な文があることに気付きました。

「WebApplication1.ServiceReference2.System.Collections.Generic.KeyValuePair_2OfString_Object」 には設定可能なプロパティがありません

辞書は KeyValue ペアのリストに過ぎず、KeyValuePair<TKey, TValue>構造体には "Key" と "Value" という名前の 2 つのプロパティがあり、get アクセサーのみを持ちます。したがって、それらは読み取り専用です。

まだわからない何らかの理由で、OData サービス リファレンスは読み取り専用プロパティを逆シリアル化できないと結論付けるかもしれません。

私の回避策は機能しましたが、いつかサービス リファレンスにこのプロパティを設定するリフレクションの方法があるのではないかと考えています。

于 2013-11-21T07:02:52.540 に答える
5

2015 年以降にこれを読んでいる人のために: OData V4 はオープン型をサポートしています: https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/ odata-v4/use-open-types-in-odata-v4

辞書のタイプは次のとおりです。

IDictionary<string, object>.

Odata は Open Type を作成します。

于 2018-09-19T10:06:13.153 に答える
1

Web API OData はまだオープン型をサポートしていません。これはあなたが探しているものだと思います。Dictionary<string, object>EDM ではうまくモデル化されません。

Post 型をモデル化するためのより良い方法があるかどうかを確認するために、Post.Parameters が何を含むべきかをさらに説明していただけますか?

于 2013-11-14T00:03:32.987 に答える