我想从数据库加载一个实体,然后使用它的 ICollection(来自模型类)加载一些子数据。如果它是一对多的关系,那么从单个 View 模型中做到这一点就足够简单了,但我有一个更复杂的结构 -
parent 有很多 child 。每个 child 都有许多孙子,需要将其链接回正确的 child 。层次结构需要保持完整。
到目前为止我提出的其他选项可能不是最好的方法,所以我的问题是 - 加载孙子的最佳实践是什么 - 或者其他方法?
在配置元数据存储时在构造函数中 -
function configureMetadataStore(metadataStore) {
metadataStore.registerEntityTypeCtor(
'Child', null, childInitializer);
}
function childInitializer(child) {
child.grandchildren = (Do something here)
return grandchildren;
});
}
在填充子项的 View 模型中 -
function refresh() {
return datacontext.getChildren(childs, parentId);
}
var addGrandChildren = function () {
$.each(childs, function (i) {
var grandChildren = ko.observableArray();
var childId = $(this).data(id);
datacontext.getGrandChildren(grandChildren, childId);
});
return;
};
或者其他方法?
最佳答案
只要您的关系不是单向的,Breeze 实体就会在您查询时自动将它们自己连接在一起。 (编辑:从 v 1.3.5 开始 - Breeze 也将连接单向关系。)
这意味着,如果您使用查询来提取恰好相关的 n 个实体,那么所有这些实体都将以正确的方式自动相互链接。如果您使用 EntityQuery.expand 方法,也会发生同样的情况。因此,您的问题只是如何以最少的调用次数查询您想要的图表的任何部分。
注意:如果您确实想实际“行走”图形,您还应该查看 EntityAspect.loadNavigationProperty 方法。但如果您处理的是大型图表,这可能会导致性能不佳。
关于javascript - 何时将扩展附加复杂类型添加到 Breeze 实体上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16196861/