根据breeze api,当调用setDeleted时,它将从所有相关实体中删除该实体。这是事实,但使用实体管理器的 importEntities 函数导入已删除项目时,该行为存在缺陷。已删除的实体将清空其导航属性,但具有包含已删除项目的导航属性的其他实体将将该项目保留在其导航列表中。如果在实体上调用 setDeleted,即使实体已被删除,也会解决问题,但这不是必需的。
我已经为 DocCode 测试创建了这个测试用例。
/*********************************************************
* Create an EM with parent/child relationship data. Export the EM and import it into a new one, delete the child item in the exported EM
* export the 2nd EM into the first EM.
*********************************************************/
test("test imported deleted nav properties", 2, function () {
var em = newEm();
// create a new parent Customer
var parentCustomer = em.createEntity("Customer", {
CustomerID: dummyCustID,
CompanyName: 'TestCo'
});
// a new Order which is a child of the parent Customer
var newOrder = em.createEntity("Order", {
CustomerID: parentCustomer.CustomerID()
});
parentCustomer.entityAspect.setUnchanged();
newOrder.entityAspect.setUnchanged();
// clone the EM data
var expEntities = em.exportEntities(null, true);
//var newEm = newEm();
var newEM = new breeze.EntityManager();
newEM.importEntities(expEntities, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });
// delete the order
var newOrderCopy = newEM.getEntities("Order")[0];
newOrderCopy.entityAspect.setDeleted();
// export the cloned EM
var expEntitiesNew = newEM.exportEntities();
// merge to the original EM
em.importEntities(expEntitiesNew, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges });
var deletedOrder = parentCustomer.Orders();
ok(newOrder.entityAspect.entityState.isDeleted(), "newOrder should be 'deleted'");
ok(deletedOrder.length === 0, "parentCustomer's 'Orders' should be empty");
});
Breeze 文档描述了沙盒编辑的概念(http://www.getbreezenow.com/documentation/multiple-managers http://www.getbreezenow.com/documentation/multiple-managers)。我想将这个概念应用到模式对话框中。仅当用户单击“确定”按钮时,主窗口才会接受她的更改。当她单击取消按钮时,她的更改应该被删除。
这些是步骤:
- 创建一个新的EntityManager(沙盒)
- 使用应在对话框中显示或更改的实体填充沙箱 EntityManager。
- 打开对话框并移交 Sandbox EntityManager。
- 当用户单击“确定”按钮时,从沙箱 EntityManager 中导出所有已更改、添加和删除的实体,并将它们导入到主或父 EntityManager 中。
- 当用户单击取消按钮时,不要理睬沙箱实体管理器,让垃圾收集器来完成工作。
在将已删除的实体传输回主或父 EntityManager 时,我遇到了此处描述的完全相同的问题。
var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted);
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false);
mainEm.importEntities(deletedEntitiesExport).entities;
导入的实体被标记为已删除(EntityState 为已删除),但不会针对相关实体的导航属性删除它们。
tsdude 推荐的解决方法确实not为我工作:
var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted);
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false);
var deleted = mainEm.importEntities(deletedEntitiesExport).entities;
// without effect :-(
deleted.forEach(function (e) {
e.entityAspect.setDeleted();
});
我无需导入已删除的实体即可完成此操作。我迭代已删除的实体,并将主 EntityManager 中的对应实体显式标记为已删除:
sandboxEm.getEntities(breeze.EntityState.Deleted).forEach(function (deleted) {
var key = deleted.entityAspect.getKey();
var e = mainEm.getEntityByKey(key);
e.entityAspect.setDeleted();
});
注:Breeze版本为1.5.2。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)