4

アイテムのリストを返す WebAPI サービスを公開しました。私は Breeze を実装しており、基本的にフィルタリング/ソートで動作させることができました。ただし、展開は機能していません。

http://www.ftter.com/desktopmodules/framework/api/dare/dares?$expand=ToUser

上記の応答で ToUserId ForeignKey を確認できますが、ToUser プロパティは NULL です (ユーザーは確実に存在します)。

メタデータで ToUser EF ナビゲーション プロパティを確認できます。

サーバー側で.Includeを使用すると、EF を設定できますが、これはしたくありません。

Expand で Breeze チュートリアル 2 を確認しました: http://learn.breezejs.com/ ここでは展開なしです: http://learn.breezejs.com/api/northwind/Products

これは Expand を使用したものです (追加のカテゴリ情報を確認できます): http://learn.breezejs.com/api/northwind/Products?$expand=Category

これは私がやろうとしていることですが、私のものはそれを満たしていません...

更新: Breeze 1.3.6 サンプル をダウンロードし、VS2011 に DocCode ソリューションをロードしました。私はそれを実行し、クライアント側の展開が機能することを確認しました。例 http://localhost:47595/breeze/Northwind/Orders?$top=1 (展開なし) http://localhost:47595/breeze/Northwind/Orders?$top=1&$expand=Customer (顧客を正しく展開します)。

WebAPI コントローラー コードを確認したところ、Model First ではなく EF Code First を使用していることを除いて、同じように見えます。外部キーは、次のプロパティで装飾されています。

機能するそよ風サンプル

[ForeignKey("CustomerID")]
[InverseProperty("Orders")]
public Customer Customer {get; set;}

意味がありません...それは私のWebAPIコントローラーまたはEntityFrameworkの関係に関係しています...

更新 2 最も基本的な ToDo Knockout Breeze サンプルをダウンロードし、この行を ToDoItem クラスに追加しました。public User ToUser { get; set; } その後、WebAPI 呼び出しを展開できます。with http://localhost:63030/breeze/todos/Todos?$expand=ToUser

したがって、Code First ではなく EntityFramework DB First を使用しているという事実に関係があるという結論に達しました。Breeze と EF を使用して、現在のバージョンの WebAPI で実行できることは間違いないようです。

更新 3 データベース、EF Database First および Code First の違いに絞り込みましたが、まだ問題を特定していません。モデルからコードファーストのアプローチに変更しましたが、結果はまったく同じです(つまり、展開しません)。

例: この Expand on the Breeze サイト ( http://learn.breezejs.com/api/northwind/Products?%24expand=Category ) を見ると、最後のパラメーターを無効なフィールドに変更してみると、エラー、例: http://learn.breezejs.com/api/northwind/Products?%24expand=Category1

ただし、私のコードでは、常にこのパラメータを無視してすべてのレコードを返し、Expand パラメータが正しくない場合は例外をスローしません: http://www.ftter.com/desktopmodules/framework/api/dare/dares?$ expand=To4657657User

したがって、私は困惑しています..なぜこれが機能しないのかわかりません。

マイコード

    [HttpGet]
    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    public HttpResponseMessage Dares()
    {
        var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<Dare>)contextProvider.Context.Dares);
        return ControllerUtilities.GetResponseWithCorsHeader(response);
    }

これが私のEFモデルから生成されたクラスです(Database Firstを使用)

public partial class Dare
{
    public int DareId { get; set; }
    public int ToUserId { get; set; }
    public virtual User ToUser { get; set; }
}
4

2 に答える 2

0

私は問題を発見したと思います - HttpResponseMessage 戻り値の型を持つ IQueryable は、純粋な IQueryable 戻り値の型と同じように動作しません。ラップしないと展開がうまくいくようです。

ここで新しい質問を提起しました: CORS で Breeze IQueryable を使用する方法は?

于 2013-07-04T17:14:32.750 に答える