如果我的实体包含另一个实体的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。
虽然我还没有对它进行过测试,但它在逻辑上对我有用,但我是否应该在createEntity / modifyEntity / saveEntity循环中循环我想要添加到childEntities集合的每个新子对象?这是唯一的方法吗?还是有办法一次性完成所有childEntities?
“parentID”是一个标识字段 - 存储已生成,所以我必须等待初始父保存完成才能使用返回的ID。
编辑添加:我认为我不需要在异步newChildEntity保存结束时使用“then”,是吗?我需要它仍然是异步的,所以它可以快速循环并循环遍历多个childEntities,因为依赖位是来自已经生成的父记录的id。所有子记录共享相同的parentID,因此我可以在不等待saveChanges方法响应的情况下设置多个保存,对吧?
答案 0 :(得分: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...
}
}
}