アイテムのリストを返す 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; }
}