1

DateTimeOffset列の述語を使用してエンティティにクエリを実行しようとしていますが、Breeze.WebApiから500エラー応答が返されます。エラーメッセージは

Unable to perform operation: leon types:System.Nullable`1[System.DateTimeOffset], System.DateTime

私が見たウリは次のようなものです

http://localhost:49800/api/Breeze Orders?$filter=LocalDateTime%20le%20datetime'2013-03-03T00%3A00%3A00.000Z'

何が機能しているのか:

  • 他のDateTime、テキスト列でクエリできます
  • 'LocalDateTime'フィールドに新しいデータを保存できます

クエリからの完全なエラー応答は次のとおりです。

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Unable to perform operation: leon types:System.Nullable`1[System.DateTimeOffset], System.DateTime
</ExceptionMessage>
<ExceptionType>System.Exception</ExceptionType>
<StackTrace>
at Breeze.WebApi.ParseTreeVisitor.CoerceTypes(String operatorName, Expression& leftExpr, Expression& rightExpr) at Breeze.WebApi.ParseTreeVisitor.VisitBinary(ParseTreeNode node, String operatorName, Expression leftExpr, Expression rightExpr) at Breeze.WebApi.ParseTreeVisitor.VisitNode(ParseTreeNode node) at Breeze.WebApi.ParseTreeVisitor.Parse(Type rootType, ParseTreeNode node) at Breeze.WebApi.ExpressionTreeBuilder.Parse(Type rootType, String source) at Breeze.WebApi.ODataActionFilter.BuildFilterFunc(String filterQueryString, Type elementType) at Breeze.WebApi.ODataActionFilter.OnActionExecuted(HttpActionExecutedContext actionExecutedContext) at System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext, HttpResponseMessage response, Exception exception) at System.Web.Http.Filters.ActionFilterAttribute.<>c__DisplayClass2.<System.Web.Http.Filters.IActionFilter.ExecuteActionFilterAsync>b__0(HttpResponseMessage response) at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass41`2.<Then>b__40(Task`1 t) at System.Threading.Tasks.TaskHelpersExtensions.ThenImpl[TTask,TOuterResult](TTask task, Func`2 continuation, CancellationToken cancellationToken, Boolean runSynchronously)
</StackTrace>
</Error>

編集

そこに着きますが、完全ではありません。Breeze 1.2.8をインストールした後、クライアントは正しく入力されたuriを生成しています。

http://localhost:49800/api/Breeze/Orders?$filter=LocalDateTime%20ge%20datetimeoffset'2013-01-01T11%3A00%3A00.000Z'

私の場合、setEntityTypeForResourceNameを使用してエンティティタイプを修正する必要はありません。上記のuriはまだ私にエラーを与えます:

Unable to perform operation: leon types:System.Nullable`1[System.DateTimeOffset], System.DateTimeOffset

サーバー側モデルをから変更する

public Nullable<System.DateTimeOffset> LocalDateTime { get; set; }

public System.DateTimeOffset LocalDateTime { get; set; }

私のURIが機能することを許可します。では、null許容のDateTimeOffsetを修正していただけませんか。

4

1 に答える 1

1

これはv1.2.7で修正されています。それでもエラーが表示される場合は、投稿してください。

- - さらに詳しい情報 - -

1.2.7以降、このエラーがまだ発生していることを示すいくつかの投稿があります。問題は、そよ風が「dataTimeOffsets」を理解していないということではないことがわかりました。'DateTimeOffsets'を含むクエリの場合を除いて、そよ風はクエリでの不正なEntityType /Resourcenameマッピングを非常に許容します。この投稿は少し長いので、修正が必要な場合は、最後の段落を読んでください。

「操作を実行できません:...」エラーは、クエリで宣言されたリソース名(「from」句の値)を既存のentityType名(で定義された)にマップできない場合に、dateTimeOffsetプロパティに対してクエリを実行すると発生しますメタデータ)。

breezeは、クエリで宣言されたリソース名にマップするエンティティタイプを見つけることができる場合、そのentityTypeのメタデータを使用してクエリを検証し、ODataフィルター文字列を作成します。ただし、一部の'resourceNameがエンティティにマップされないため、完全に許容できる条件である一致するエンティティタイプが見つからない場合は、クエリに含まれる定数パラメータを調べて、クエリ句に含まれるデータ型を推測しようとします。そしてそれらのデータ型を使用します。問題は、javascriptの日付オブジェクトを.NETの「DateTime」または「DateTimeOffset」のいずれかにマップでき、Breezeは1つしか選択できず、この場合は「間違った」オブジェクトを選択することです。

この種のミスマッピングは、クエリからデータが返されるときに問題を引き起こしません。これは、breezeがクエリのエンティティタイプのみを使用して、適切なODataフィルター文字列を検証および構築するためです。クエリから返されたデータは、返された各アイテムのentityTypesを判別するために検査されるため、resourceName/entityTypeマッピングは必要ありません。(「expand」または「select」句を使用しているため、1つのクエリで複数のエンティティタイプが返される場合があります。)

マッピングの問題の根本的な原因は、各メタデータストアにそよ風が保持するエンティティタイプへのリソース名のマッピングに関係しています。このマッピングは、MetadataStore.getEntityTypeNameForResourceNameメソッドとMetadataStore.setEntityTypeForResourceNameメソッドを介して利用できます。Entity Frameworkメタデータを使用する場合、breezeはEntityFrameworkの「EntitySet」名が「resourceNames」に対応していると想定します。 この仮定が問題の原因です。EntitySet名の1つとは異なる「resourceName」をクエリすると、Breezeは対応する「エンティティタイプ」を認識せず、「エンティティタイプ」メタデータを使用する代わりに、クエリで使用されるデータ型の推測にフォールバックします。

2つの非常に単純な修正があり、どちらも機能します。

1)MetadataStore.setEntityTypeForResourceNameメソッドを使用して、リソース名をエンティティタイプにマップします。同じエンティティタイプにマップするリソース名はいくつでも持つことができることに注意してください。

2)メソッド(リソース名に対応)に、返されるタイプの名前ではなく、EFで定義された対応するEntitySetの名前を付けます。一般的な規則では、EntitySet名(したがってリソース名)は複数形ですが、EntityType名は通常単数形です。つまり、「Customers」はリソース名であり、「Customer」はEntityTypeです。

于 2013-03-19T04:52:12.130 に答える