Breeze 微风错误:";“未定义”不是一个函数;

Breeze 微风错误:";“未定义”不是一个函数;,breeze,Breeze,首先,我有一个由EF代码创建的数据库,其中有两个主要类:“categories”和“products” 每个类别都有一个产品列表(与该类别关联的产品)的导航属性 我创建了一个web api,返回一个“IQueryable”——所有与特定类别关联的产品 这是api控制器-通过url调用时工作正常: [HttpGet] public IQueryable<Product> ProductsFilteredByCategory(int categoryId) { return _

首先,我有一个由EF代码创建的数据库,其中有两个主要类:“categories”和“products”

每个类别都有一个产品列表(与该类别关联的产品)的导航属性

我创建了一个web api,返回一个“IQueryable”——所有与特定类别关联的产品

这是api控制器-通过url调用时工作正常:

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

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

}
我得到以下错误:“undefined不是函数”

奇怪的是,当我更改服务器端的控制器以只返回所有产品的简单“IQyeryable”列表时,没有错误。。。但这不是我需要的-我只需要那些与特定类别相关的产品

谢谢你的帮助


Elior

您不必在控制器方法中使用该参数,您可以删除该参数并在breeze实体查询中使用声明。其中()这样做的好处是控制器不必如此具体

此外,您不需要使用.include(),因为breeze允许您使用.expand()展开导航属性

这将更多地利用breeze在项目中可以帮助您的功能

将ProductsFilteredByCategory(int categoryId)更改为


如果您不想这样做,那么我认为您需要重做您的控制器方法。您应该返回产品实体,但您正在查询类别。

非常感谢你们的支持,我非常感谢

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; }
}
如您所见,结果是一个单独的“类别”,我在“querySuccedd()”函数中从中检索“产品”

这是可行的,但我希望使用另一种不可行的方法:我没有传递“parentCategoryId”,而是尝试传递实际对象,而不是作为“parentCategoryObj”传递ID,然后我考虑使用以下行加载“products”导航属性,而不显式调用breeze控制器:

[HttpGet]
public IQueryable<Category> CategoryWithProducts(int categoryId)
{
    return _contextProvider.Context.Categories.Include("Products").Where(c => c.CategoryId == categoryId);
}
parentCategoryObj.entityAspect.loadNavigationProperty("products")
但是,这导致没有像导航属性为null那样加载“产品”。奇怪的是,当我在这行中将“产品”改为“子类别”只是为了检查导航属性是否有问题时,“子类别”数据加载正确。我不明白为什么一个导航属性的行为与另一个不同(都是列表)。我读了更多关于这方面的内容,注意到目前Breeze不支持“多对多”关系,我想这就是原因,对吗

再次感谢你们,这是一个很好的机会,如果知道好人愿意帮助


Elior

谢谢Kadumel!我刚刚添加了我的解决方案,也参考了您的建议,谢谢!在这一点上,它实际上是更困难的,我不是EF专家,但你的模型是非常困惑我。我知道你说了很多对很多,但我不太明白你的模型实现了什么,可能Jay或Belini可以进一步帮助你,如果它确实是一个bug,仅供参考,当你试图实现的答案看起来很简单时,我会谨慎地创建这么多的变通方法。Elior,请确保您正在运行最新版本的Breeze。v 1.3.5。此错误可能是旧版本的结果。我们无法重现此问题。请提供一个复制问题的小解决方案。谢谢Jay!我刚刚添加了我的解决方案的完整描述,如果您有任何意见,我将非常高兴:-)Elior,请确保您运行的是最新版本的Breeze。v 1.3.5。此错误可能是旧版本的Lior导致的,您将解决方案添加到了哪里?请提供下载链接,以便我们进一步调查。
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; }
}
[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);
    }
};
parentCategoryObj.entityAspect.loadNavigationProperty("products")