問題タブ [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.
odata - エンティティをその子で更新するにはどうすればよいですか? パッチメソッドが機能しない
次に示すように、エンティティをその子リストで更新する必要があります。
この方法で patch メソッドを実装しました。
しかし、この方法でフィドラーから呼び出そうとすると:
Model.isValid プロパティでエラーが発生し、指定すると次のエラーが返されます。
エンティティ タイプ 'Entity1' のナビゲーション プロパティ 'ChildrenList' に PATCH を適用できません。
どうすれば解決できますか?パッチ法は正しい使用法ですか?
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
コントローラー
さらに、私は慣習的な方法で行ってみました。しかし、それもうまくいきません。
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 モデル
asp.net-web-api - Created(entity) 複合キーで例外をスロー
MyEntity
複合キーを使用するエンティティ ( ) があります。
エンティティは投稿され、問題なく挿入されますが、Created()
呼び出されると、メッセージとともに がスローInvalidOperationException
されます。
エンティティ セット 'MyEntity' の編集リンク ビルダーが null を返しました。ロケーション ヘッダーには編集リンクが必要です。
asp.net-web-api - OData WebAPI、メモリ内クエリ可能、大文字と小文字の区別
OData WebAPI とEnumerableQuery
(私が呼び出したリスト) のクエリに問題があります.AsQueryable()
。エンティティ セットがあり、Get メソッドを返すコントローラーがありますIQueryable
。そのエンティティ セットをクエリし、この $filter を使用すると、
SomeStringProp
文字と大文字小文字が等しいエンティティのみを取得'SomeValue'
します。このような関数呼び出しであっても、すべての文字列に対して大文字と小文字を区別しない比較子を使用するように OData に強制したいと思います。
SomeStringProp が と等しいエンティティを返すには、OData が必要です'APPLE'
。'PineApple'
'AppleSauce'
いくつかの追加情報:
- データベースはこれとは何の関係もありません。述べたように、コレクションはインメモリです
- OData クエリで tolower() を使用することは単なる回避策であるため、問題の解決策にはなりません
c# - 有効な Odata パス テンプレートではありません
次のようなURLを満たすOdataメソッドを作成しようとしています
ドメイン:ポート/製品/100/RedirectUrl()
しかし、私は次のような例外を得ました
コントローラー 'Products' のアクション 'RedirectUrl' のパス テンプレート '{id}/RedirectUrl()' は、有効な OData パス テンプレートではありません
私のWebapi構成には含まれています
これを達成する方法はありますか?
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
含めないと、更新時に検証例外がスローされます。User
UserStats
何かが足りない気がします。
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, ISet
1 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.TaskAwaiter
1.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()" } } }
c# - $expand リクエストで返されるものを制御する
したがって、 を使用するODataController
と、誰かが を実行した場合に何が返されるかを制御/odata/Foos(42)/Bars
できます。次のように呼び出されるためですFoosController
。
しかし、誰かが を返したときに何が返されるかを制御したい場合はどう/odata/Foos?$expand=Bars
でしょうか? どのように対処しますか?このメソッドをトリガーします。
そして.Include("Bars")
、IQueryable<Foo>
それはあなたが戻ってきたときにそれを行うだけだと思います。特に、OData が壊れないようにするにはどうすればよいですか (つまり、$select、$orderby、$top などは引き続き機能します)。