0

私は EF コード ファーストによって作成されたデータベースを持っています。ここには、「カテゴリ」と「製品」の 2 つの主要なクラスがあります。

各カテゴリには、製品 (そのカテゴリに関連付けられているもの) のリストのナビゲーション プロパティがあります。

特定のカテゴリに関連付けられたすべての製品である「IQueryable」を返す Web API を作成しました。

これは API コントローラーです。URL 経由で呼び出すと問題なく動作します。

[HttpGet]
public IQueryable<Product> ProductsFilteredByCategory(int categoryId)
{

    return _contextProvider.Context.Categories.Include("Products").First(c => c.CategoryId == categoryId).Products.AsQueryable();

}

ただし、次の関数を介してそよ風から呼び出すと:

var getProducts = function (productsObservable, parentCategoryId) {

    var query = EntityQuery.from("ProductsFilteredByCategory")
    .withParameters({ categoryId: parentCategoryId });

    return manager.executeQuery(query)
    .then(querySucceeded)
    .fail(queryFailed);

} 

次のエラーが表示されます:「未定義は関数ではありません」。

奇妙なことに、サーバー側のコントローラーを変更して、すべての製品の単純な「IQyeryable」リストを返すと、エラーはありません...しかし、これは必要なものではありません-特定の製品に関連付けられている製品のみが必要ですカテゴリー...

助けてくれてありがとう!

エリオール

4

2 に答える 2

0

お二方、ご支援ありがとうございます。

Kadumel、各「製品」は複数の「カテゴリ」に属することができるため、「製品」から「カテゴリ」への参照フォームがないため、あなたのソリューションを使用できませんでした。ただし、あなたが提案したようにコントローラーの方法を変更したところ、動作するようになりました。

これがすべてを表すコードです。同様の状況にある他の人にも役立つことを願っています。コードを改善するための提案をお待ちしております。

public class Category
{
    [Key]
    public int CategoryId { get; set; }
    [Required]
    public string Name { get; set; }
    public Int16? Order { get; set; }

    [ForeignKey("ParentCategoryId")]
    public Category ParentCategory { get; set; }
    public int? ParentCategoryId { get; set; }

    [ForeignKey("ParentCategory")]
    [InverseProperty("ParentCategory")]
    public List<Category> SubCategories { get; set; }

    [ForeignKey("ProductId")]
    public List<Product> Products { get; set; }
}
public class Product
{
    [Key]
    public int ProductId { get; set; }

    [Required]
    public string Name { get; set; }

    public string Desc { get; set; }

    public int Price { get; set; }

    //[ForeignKey("CategoryId")]
    //[InverseProperty("Products")]
    //public List<Category> Categories { get; set; }
}

(ご覧のとおり、「Product」から「Category」へのリンクの後方リストをコメントアウトしました。これは、「Product」から「Category」への後方参照として使用できた可能性があります。Kdumel はこれらのリンクを使用することを提案しましたが、私は参考文献がなくてもできるのに、参考文献がたくさんあるのは「重すぎる」と思います。同意しますか?)

これはコントローラーのコードです:

[HttpGet]
public IQueryable<Category> CategoryWithProducts(int categoryId)
{
    return _contextProvider.Context.Categories.Include("Products").Where(c => c.CategoryId == categoryId);
}

そして、これは簡単なコードです:

var getProducts = function (productsObservable, parentCategoryId) {
    var query = EntityQuery.from("CategoryWithProducts")
        .withParameters( {categoryId: parentCategoryId } )
        .select("Products");

    return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    function querySucceeded(data) {
        if (productsObservable) {
            productsObservable(data.results[0].products);
        }
        log('Retrieved [Products] from remote data source',
            data, true);
    }
};

ご覧のとおり、結果は単一の「カテゴリ」であり、そこから「querySuccedded()」関数で「製品」を取得します。

これは機能しますが、機能しない別のアプローチを使用することを望んでいました.ブリーズ コントローラーを明示的に呼び出すことなく、'products' ナビゲーション プロパティ:

parentCategoryObj.entityAspect.loadNavigationProperty("products")

ただし、これにより、ナビゲーション プロパティが null であるかのように、「製品」が読み込まれませんでした。奇妙なことに、ナビゲーション プロパティに問題があるかどうかを確認するために、この行で「products」という単語を「subCategories」に変更すると、「subCategories」データが正しく読み込まれました。あるナビゲーション プロパティが別のプロパティと異なる動作をする理由がわかりませんでした (どちらもリストです)。これについて詳しく読んだところ、現在の Breeze は「多対多」の関係をサポートしていないことに気付きました。これが理由だと思います。よろしいですか?...

ありがとうございました。良い人たちが喜んで助けてくれることを知って安心しました!

エリオール

于 2013-06-11T05:50:38.700 に答える