1

我正在尝试将单个 Breeze 实体及其相关实体拉入带有子 KO observableArrays 的 KnockOut 可观察对象(不是数组)(用于一对多关系)。我不知道如何使用 fetchEntitybyKey 来做到这一点 - 我可以使用带有谓词的 entityQuery 来做到这一点,但是它需要一个 observableArray(这使得后续编码更加困难并且标记更加复杂)。

有没有人有这样做的代码示例?

非常感谢杰里米

4

1 回答 1

3

您可以使用 fetchEntityById 作为从缓存或远程服务获取特定实体的便捷方式。然后扩展必须在另一个查询中完成。无论如何,您几乎总是希望分两步执行此操作,因为在进行远程和扩展之前,您需要检查缓存版本是否是您所需要的。该检查不包含在下面的代码中,但您只需替换return refreshProject(p);为,return p.isPartial() ? refreshProject(p) : projectObservable(p);因此您仅在实体已被标记为部分实体或因其他原因需要刷新时才刷新。当然,您必须实现将实体标记为部分的逻辑。

var getProjectById = function (projectId, projectObservable) {
    // fetchEntityByKey will look in local cache first (because 3rd 
    // parm is true) and if not there then it will go remote
    return manager.fetchEntityByKey(
        'Project', projectId, true)
        .then(fetchSucceeded)
        .fail(queryFailed);

    // Refresh the entity from remote store
    function fetchSucceeded(data) {
        var p = data.entity;
        return refreshProject(p);
    }

    function refreshProject(project) {
        // fromEntities(someEntity) creates a query that gets only someEntity
        // from the remote service.
        return EntityQuery.fromEntities(project)
            .expand('navigationProp1.complexProp1,' +
                'navigationProp1.complexProp2,' +
                'navigationProp2.complexProp1,' +
                'navigationProp2.complexProp2')
            .using(manager).execute()
            .then(querySucceeded)
            .fail(queryFailed);
    }

    function querySucceeded(data) {
        var p = data.results[0];
        return projectObservable(p);
    }
};

expand子句非常有趣,因为您可能有一个导航属性,例如合同,它是一个项目所有合同的列表。如果合同仅包含可以扩展的原始数据类型,.expand('contracts')但如果合同类型具有一个或多个复杂属性,例如供应商(包括各种供应商详细信息),则仅为合同扩展只会引入供应商的 ID。语法很有趣,因为没有像这样的属性contracts.supplier,但是您告诉 Breeze 在与 的每个合同中包含供应商的所有属性expand('contracts.supplier')

于 2013-06-02T01:26:08.680 回答