我们刚刚将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
我们完全不知道该做什么,并且非常感谢任何帮助。)
答案 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查询结果中。