1

我们刚刚将 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

我们完全不知道该做什么,任何帮助将不胜感激:)

4

2 回答 2

0

这通常是由于您的 EF 模型未完全迁移到 WebApi2 造成的。我的猜测是您的服务器上正在引发错误。尝试调试到服务器端代码。

另一位客户遇到了这个并评论说:

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

于 2013-11-14T23:59:00.420 回答
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 查询结果中。

于 2014-01-16T12:36:28.653 回答