【问题标题】:Error fetching related entities with breezejs and web api2使用breezejs 和web api2 获取相关实体时出错
【发布时间】:2013-11-14 22:28:30
【问题描述】:

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

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

【问题讨论】:

  • 通常当我收到此错误时,是因为我试图对一个属性执行某些操作,该属性要么没有返回,要么不是导航实体上的有效属性。您确定这些是乐队的有效属性吗? BandMembers.User.Image、BandImages.Image、Image、BandFollowers、ExternalLinks
  • 当我尝试仅调用 expand('BandFollowers') 或 expand('Image') 时,我得到了同样的错误,我知道这些都是有效的。

标签: breeze


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的快速响应,我已经尝试过,但仍然没有运气。我深入研究了错误,这就是我得到的:TypeError: relatedEntity.getProperty is not a function:14223 这发生在:updateRelatedEntityInCollection()
  • 仔细观察,我发现我得到了相关实体及其属性,但没有微风钩住它们的额外属性和函数。出现异常:if (!relatedEntity) return;var thisEntity = relatedEntity.getProperty(inverseProperty.name);@Jay
  • 在回溯代码并试图找出问题所在后,我们在工作版本和错误版本上运行了差异。唯一的区别是public IQueryable&lt;Band&gt; Bands() 而不是public IQueryable&lt;Band&gt; Band().from("Bands") 而不是.from("Band") 当我们改回Bands 时,一切都恢复正常了,为什么它的工作超出了我的理解? @Jay
  • 这里有两个概念。一个是您的 entityType 的名称,可能是“Band”,另一个是您正在查询的资源的名称,可能是“Bands”。 entityType 名称是 EF 返回的名称,在 metadataStore 中可用。资源名称是 WebApi 控制器中的端点。更多信息在这里:breezejs.com/documentation/creating-entities
【解决方案2】:

如果这还没有解决,我在客户端上使用.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查询结果中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2018-02-12
    • 2021-05-03
    相关资源
    最近更新 更多