使用breeze js和web api 2获取相关实体时出错

时间:2013-11-14 22:28:31

标签: breeze

我们刚刚将Breezejs升级到最新版本(1.4.5),以便我们可以将它与EF 6一起使用。我们还使用OData支持将项目更新为Web Api2。

在我们的代码中,我们使用扩展查询(来自我们的datacontext.js)来获取具有相关实体的实体:

BandContext.prototype.getBandWithDetails = function (bandId) {
        var query = breeze.EntityQuery.from("Band").where(new breeze.Predicate("Id", "==", bandId)).expand("BandMembers.User.Image, BandImages.Image, Image, BandFollowers, ExternalLinks");
        return this.executeQuery(query);
    };

在breezecontroller.cs中,我们的操作如下所示:

    [HttpGet]
    [Queryable(AllowedQueryOptions = AllowedQueryOptions.Supported | AllowedQueryOptions.Expand, MaxExpansionDepth = 4)]
    public IQueryable<Band> Band()
    {
        return WebRepository.Bands;
    }

长期以来效果很好,但现在已停止工作了。当我调用WebApi控制器并且实体和相关实体通过网络发送时,我仍然得到200,但是我收到此错误消息:

relatedEntity.getProperty is not a function

我们完全不知道该做什么,并且非常感谢任何帮助。)

2 个答案:

答案 0 :(得分:0)

这通常是由于EF模型向WebApi2的迁移不完整造成的。我的猜测是你的服务器上出现了错误。尝试调试服务器端代码。

另一位客户碰到了这个并评论道:

  

“我发现了问题,我调试了获取元数据的函数,我发现了一些客户端实体,这些实体是使用指向旧的Entity Framework 5命名空间的关联定义的。”

答案 1 :(得分:0)

如果还没有解决,我在客户端使用.Expand(...)时没有加载相关实体的问题。他们会通过网络发送,但Javascript中的结果对象不包含它们。

最后我发现我必须向我的(代码优先)实体添加显式外键。

这不起作用

public class MainItem
{
    public MainItem()
    {
        this.RelatedItems = new HashSet<RelatedItem>();
    }
    public int Id { get; set; }
    public virtual ICollection<RelatedItem> RelatedItems { get; set; }
}
public class RelatedItem
{
    public int Id { get; set; }
    public MainItem MainItem { get; set; }
}

但这有效

public class RelatedItem
{
    public int Id { get; set; }
    public MainItem MainItem { get; set; }
    public int MainItemId { get; set; }
    public string Name { get; set; }
}

注意额外属性MainItemId,它突然使相关实体显示在Javascript查询结果中。

相关问题