1

如果我有一个实体包含另一个实体的 1:n 集合,那么保存集合的正确方法是什么?

我有这个(代码尚未最终确定/检查):

return datacontext.savechanges([parentEntity]).then(function() {
    for (var i=0;i < childArray.length;i++) {

        var newChildEntity;
        return datacontext.makeNewChildEntity(newChildEntity).then(function() {
            newChildEntity.parentID(parentEntity().id());
            ...
            //set other newChildEntity properties
            ...
            return datacontext.savechanges([newChildEntity]).then(function() {               
                 //set finished flag and exit function...
            }

        }
    }
}

“datacontext”是一个带有各种公开方法的异步模块,包括创建一个新的 childEntity。

虽然我还没有对此进行测试,但它在逻辑上对我有用,但是对于我想添加到 childEntities 集合中的每个新子对象,我在 createEntity/modifyEntity/saveEntity 循环中循环是否正确?这是唯一的方法还是有一种方法可以一次性完成所有子实体?

“parentID”是一个身份字段 - 存储生成,因此我必须等待初始父级保存完成,然后才能使用返回的 ID。

编辑添加:我认为我不需要在异步 newChildEntity 保存的末尾有一个“then”,对吗?我需要它仍然是异步的,因此它可以快速关闭并循环遍历多个 childEntities,因为依赖位是已经生成的父记录中的 id。所有子记录共享相同的 parentID,因此我可以设置多个保存,而无需等待 saveChanges 方法响应,对吧?

4

1 回答 1

2

Breeze 的 EntityManager.saveChanges 可以在一次调用中保存任意数量的实体,这比尝试为每个实体调用一次 saveChanges 性能要高得多。

另外,我不确定为什么你的 makeNewChildEntity 需要异步,Breeze 的 EntityManager.createEntity 本身是同步的,所以我认为你需要做的就是这样。

return datacontext.savechanges([parentEntity]).then(function() {
    var listOfEntities = [parentEntity];
    for (var i=0;i < childArray.length;i++) {
        // synchronous makeNewChildEntity
        var newChildEntity = datacontext.makeNewChildEntity();
        newChildEntity.parentID(parentEntity().id());
        ...
        //set other newChildEntity properties
        ...
        listOfEntities.push(newChildEntity);
     }
     // alternatively use datacontext.savechanges(listOfEntities).then(...)
     return datacontext.savechanges().then(function() {               
             //set finished flag and exit function...
     }
}

}

于 2013-10-14T17:34:22.120 回答