Breeze-已删除项目导航属性错误

Breeze-已删除项目导航属性错误,breeze,Breeze,根据BreezeAPI,当调用setDeleted时,它将从所有相关实体中删除该实体。这是正确的,但使用实体管理器的Importenties函数导入已删除项时,该行为存在缺陷。删除的实体将清空其导航属性,但具有包含删除项目的导航属性的其他实体将在其导航列表中保留该项目。如果对实体调用setDeleted,即使它已被删除,它也会修复问题,但这应该不是必需的 我已经为DocCode测试创建了这个测试用例 /***********************************************

根据BreezeAPI,当调用setDeleted时,它将从所有相关实体中删除该实体。这是正确的,但使用实体管理器的Importenties函数导入已删除项时,该行为存在缺陷。删除的实体将清空其导航属性,但具有包含删除项目的导航属性的其他实体将在其导航列表中保留该项目。如果对实体调用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 docu描述了沙盒编辑()的概念。我想在模态对话框中应用这个概念。只有当用户单击“确定”按钮时,她的更改才会在主窗口中被接受。当她单击“取消”按钮时,她的更改将被删除

以下是步骤:

  • 创建新的EntityManager(沙盒)
  • 使用应在对话框中显示或更改的实体填充沙盒EntityManager
  • 打开对话框并移交沙盒EntityManager
  • 当用户单击ok按钮时,从Sandbox EntityManager导出所有更改、添加和删除的实体,并将它们导入主EntityManager或父EntityManager
  • 当用户单击cancel按钮时,让Sandbox EntityManager单独工作,让垃圾收集器完成工作
在将删除的实体转移回主实体或父实体管理器时,我遇到了与本文描述的完全相同的问题

var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted);
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false);
mainEm.importEntities(deletedEntitiesExport).entities;
导入的实体标记为已删除(EntityState已删除),但不会删除相关实体的导航属性

tsdude推荐的解决方案对我来说并不奏效:

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();
});
我能够做到这一点,而无需导入已删除的实体。我迭代删除的实体,并将主EntityManger中的对应实体明确标记为已删除:

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。

很抱歉花了这么长时间,这一版本已经过时了


这是一个bug,现在已在GitHub回购协议中修复。它也将在1.5.3版本中发布。。。谢谢你的重播

删除实体后是否保存了更改?否,我没有保存更改。但这与我报告的bug没有直接关系。我将在下周初尝试重新编写。或者你可以用breeze zip中的DocCode示例向我发送一个简单的复制单元测试。我不确定如何向你发送电子邮件,所以我用在你的DocCode示例的entityTest.js中运行的单元测试修改了OP。我想我也遇到了这个问题。有什么消息吗?现在调查一下。