問題タブ [asp.net-web-api-odata]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
4251 参照

odata - エンティティをその子で更新するにはどうすればよいですか? パッチメソッドが機能しない

次に示すように、エンティティをその子リストで更新する必要があります。

この方法で patch メソッドを実装しました。

しかし、この方法でフィドラーから呼び出そうとすると:

Model.isValid プロパティでエラーが発生し、指定すると次のエラーが返されます。

エンティティ タイプ 'Entity1' のナビゲーション プロパティ 'ChildrenList' に PATCH を適用できません。

どうすれば解決できますか?パッチ法は正しい使用法ですか?

0 投票する
0 に答える
159 参照

c# - Derived が ODataRoute を使用している場合、BaseController のメソッドにルーティングできません

BaseController追加の s を定義する for コントローラーへのルーティングに問題があります[ODataRoute]

  • GET ~/odata/Foos WORKS
  • GET ~/odata/Foos(1) WORKS
  • GET ~/odata/Foos(1)/Bars WORKS
  • GET ~/odata/Bars 404 が見つかりません

BaseController

コントローラー

さらに、私は慣習的な方法で行ってみました。しかし、それもうまくいきません。

0 投票する
2 に答える
735 参照

c# - 関連するビジネス エンティティを .NET で Web API に使用するように設計する最良の方法は何ですか?

Web API/oData 経由で公開される以下のような .NET でビジネス エンティティを設計しようとしています。

ビジネス エンティティ 1 : 以下のプロパティを持つ「車両」:

  • VehicleId 文字列
  • ModelId 文字列

ビジネス エンティティ 2 : 以下のプロパティを持つ「モデル」:

  • ModelId 文字列
  • ModelDescription 文字列

誰かが私の Web API を使用して車両情報のみを取得し、モデルの説明も表示したい場合、2 つの HTTP 呼び出しを行う必要があります。これにより、特に低速ネットワークでパフォーマンスが低下します。このシナリオでは、Web API を介して最適なパフォーマンスを提供するネストされたビジネス エンティティをロードおよびモデル化するための最良の方法を知りたいですか?

次のように Vehicle クラスをモデル化する必要がありますか? REST/Web API 設計の良い方法ですか? 以下のアプローチでは、含まれているエンティティも原因で、エンティティが重くなりすぎているようです。お知らせ下さい。

ビジネス エンティティ 1 : 以下のプロパティを持つ「車両」:

  • VehicleId 文字列
  • ModelId モデル
0 投票する
1 に答える
234 参照

asp.net-web-api - Created(entity) 複合キーで例外をスロー

MyEntity複合キーを使用するエンティティ ( ) があります。

エンティティは投稿され、問題なく挿入されますが、Created()呼び出されると、メッセージとともに がスローInvalidOperationExceptionされます。

エンティティ セット 'MyEntity' の編集リンク ビルダーが null を返しました。ロケーション ヘッダーには編集リンクが必要です。

0 投票する
1 に答える
916 参照

asp.net-web-api - OData WebAPI、メモリ内クエリ可能、大文字と小文字の区別

OData WebAPI とEnumerableQuery(私が呼び出したリスト) のクエリに問題があります.AsQueryable()。エンティティ セットがあり、Get メソッドを返すコントローラーがありますIQueryable。そのエンティティ セットをクエリし、この $filter を使用すると、

SomeStringProp文字と大文字小文字が等しいエンティティのみを取得'SomeValue'します。このような関数呼び出しであっても、すべての文字列に対して大文字と小文字を区別しない比較子を使用するように OData に強制したいと思います。

SomeStringProp が と等しいエンティティを返すには、OData が必要です'APPLE''PineApple''AppleSauce'

いくつかの追加情報:

  • データベースはこれとは何の関係もありません。述べたように、コレクションはインメモリです
  • OData クエリで tolower() を使用することは単なる回避策であるため、問題の解決策にはなりません
0 投票する
1 に答える
2159 参照

c# - 有効な Odata パス テンプレートではありません

次のようなURLを満たすOdataメソッドを作成しようとしています

ドメイン:ポート/製品/100/RedirectUrl()

しかし、私は次のような例外を得ました

コントローラー 'Products' のアクション 'RedirectUrl' のパス テンプレート '{id}/RedirectUrl()' は、有効な OData パス テンプレートではありません

私のWebapi構成には含まれています

これを達成する方法はありますか?

0 投票する
1 に答える
1094 参照

c# - WebAPI OData v4 との 1 対 0 または 1 対 1 の関係

私はEntity Framework 4.3を使用しており、最初にコードを実行しています。このような1対0または1の関係にある2つのテーブルがあります...

また、ASP.Net WebAPI 2.2 w/ OData v4 と OData Client Code Generator テンプレートも使用しています。

WebAPI が作成するメタデータ ファイルIsNullable="False"には、ユーザーのUserIDプロパティの属性がありません。そのため、OData クライアント コード ジェネレーターは User クラスのUserIDプロパティを null 可能にしていますが、これは正しくありません。特に主キーである場合はそうではありません。

[Required]UserStatsのプロパティに追加しようとしましたが、クラスの保存/更新時に をUser含めないと、更新時に検証例外がスローされます。UserUserStats

何かが足りない気がします。

0 投票する
1 に答える
1317 参照

c# - テーブル値関数を Web Api 2 OData v4 サービス内のエンティティ セットのプロパティとして公開するにはどうすればよいですか?

Web Api 2 OData v4 サービスで設定されたエンティティのプロパティとしてテーブル値関数を公開する方法を理解するのに助けが必要です。

私の単純化されたスキーマには、Structures、Locations、および LocationLinks の 3 つのテーブルがあります。構造体には、ノード (Locatons) とエッジ (LocationLinks) を持つグラフが含まれています。Entity Framework 6 データベースの最初のモデルでアクセスします。

目標は、構造物の位置にアクセスするのと同じ方法で、LocationLinks の構造物コレクションにアクセスすることです。つまり、構造 #180 のグラフを要求するには:

Locations クエリは自動的に機能しますが、正しいルートを追加して LocationLinks クエリを有効にする方法がわかりません。タスクが簡単になると考えて、テーブル値関数を SQL サーバーに追加しました。関数は私の EF モデルに存在し、LocationLink エンティティのコレクションを返します。

残念ながら、私が何をしようとしても、Structure(180)\LocationLinks URL を機能させることができないようです。これは私の最新の試みです:

StructuresController.cs スニペット:

WebApi.cs スニペット:

私が受け取るエラーは次のとおりです。

{ "エラー":{ "コード":"","メッセージ":"要求 URI ' http://.../OData/Structures(180)/LocationLinks ' に一致する HTTP リソースが見つかりませんでした。"," innererror":{ "message":"テンプレート '~/entityset/key/unresolved' を使用して OData パスのアクションを選択するためのルーティング規則が見つかりませんでした。","type":"","stacktrace":"" } } }

いくつかの検索に基づいて、ODataRoute 属性をコントローラーに追加しようとしました。

次のエラーが発生します。

コントローラー 'Structures' のアクション 'GetLocationLinks' のパス テンプレート 'Structures({key})/LocationLinks' は、有効な OData パス テンプレートではありません。OData パス テンプレート 'Structures({key})/LocationLinks' に未解決のパス セグメント 'LocationLinks' が見つかりました。

Structures コレクションから LocationLinks を公開するにはどうすればよいですか? お時間をいただきありがとうございます。

編集:

この質問を見つけた後、私はなんとかこれを機能させることができました: カスタムクエリをサポートするナビゲーションプロパティを ODataConventionModelBuilder に追加する

ODataConventionBuilder オブジェクトで .GetEdmModel を呼び出し、次の関数を使用してナビゲーション プロパティをモデルに追加する必要がありました。

私が今抱えている問題は、クエリでナビゲーション プロパティにアクセスする機能が制限されていることです。たとえば、このリンクは機能します:

これはそうではありませんが。

返されるエラーは

{ "error": { "code":"","message":"エラーが発生しました。","innererror": { "message":"インスタンス プロパティ 'LocationLinks' は型 'ConnectomeDataModel.Structure' に対して定義されていません", "type":"System.ArgumentException","stacktrace":" System.Linq.Expressions.Expression.Property(Expression expression, String propertyName) で \r\n System.Web.OData.Query.Expressions.SelectExpandBinder で.CreatePropertyValueExpressionWithFilter(IEdmEntityType elementType, IEdmProperty property, Expression source, FilterClause filterClause)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder.BuildPropertyContainer(IEdmEntityType elementType, Expression source,ディクショナリ2 propertiesToExpand, ISet1 propertiesToInclude、ISet1 autoSelectedProperties, Boolean isSelectingOpenTypeSegments)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder.ProjectElement(Expression source, SelectExpandClause selectExpandClause, IEdmEntityType entityType)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder.Bind(IQueryable queryable)\r\n at System.Web.OData.Query.ODataQueryOptions.ApplySelectExpand[T](T entity, ODataQuerySettings querySettings)\r\n at System.Web.OData.Query.ODataQueryOptions.ApplyTo(IQueryable query, ODataQuerySettings querySettings)\r\n at System.Web.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)\r\n at System.Web.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n at System.Web.Http.Filters.ActionFilterAttribute.OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n--- 例外がスローされた前の場所からのスタック トレースの終わり ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (タスク タスク) で\r\n System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() で\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()" } } }

0 投票する
2 に答える
1071 参照

c# - $expand リクエストで返されるものを制御する

したがって、 を使用するODataControllerと、誰かが を実行した場合に何が返されるかを制御/odata/Foos(42)/Barsできます。次のように呼び出されるためですFoosController

しかし、誰かが を返したときに何が返されるかを制御したい場合はどう/odata/Foos?$expand=Barsでしょうか? どのように対処しますか?このメソッドをトリガーします。

そして.Include("Bars")IQueryable<Foo>それはあなたが戻ってきたときにそれを行うだけだと思います。特に、OData が壊れないようにするにはどうすればよいですか (つまり、$select、$orderby、$top などは引き続き機能します)。