Asp.net web api 使用WebApioDataAdapter,使用Breeze在同一实体上进行多个快速保存

Asp.net web api 使用WebApioDataAdapter,使用Breeze在同一实体上进行多个快速保存,asp.net-web-api,odata,breeze,Asp.net Web Api,Odata,Breeze,我正在使用Breeze和EntityAction.PropertyChange上触发的自动保存机制,以及SaveQueueing扩展。这通常效果很好。 当实体发生更改时,会触发保存,并且在保存过程中会对同一实体进行另一次更改,则会出现问题。在这种情况下,另一个存储将排队。但是,一旦第一次保存完成,实体状态将变为未修改状态 是否有可能用breeze处理这种情况 更新:下面是一个测试用例的示例,它再现了saveQueuing扩展2.0版和WebApioDataAdapter的问题。我重新编写了sav

我正在使用Breeze和EntityAction.PropertyChange上触发的自动保存机制,以及SaveQueueing扩展。这通常效果很好。 当实体发生更改时,会触发保存,并且在保存过程中会对同一实体进行另一次更改,则会出现问题。在这种情况下,另一个存储将排队。但是,一旦第一次保存完成,实体状态将变为未修改状态

是否有可能用breeze处理这种情况


更新:下面是一个测试用例的示例,它再现了saveQueuing扩展2.0版和WebApioDataAdapter的问题。

我重新编写了saveQueuing,从头开始。现在它从一开始就涵盖了您的场景。查看文件顶部的注释以查看已知的限制

我还更新了使用它的示例。看

我仍然对这种自动保存体验感到不舒服,尤其是在网络延迟时间过长的情况下,可能会出现恶作剧

祝你好运

11月28日更新 自从重新编写saveQueuing以来,我一直试图重现您在评论中描述的失败用例。。。而且不能

这是。告诉我我错过了什么

asyncTest("saves DIFFERENT modified value of MODIFIED entity when saved before 1st save completes", function () {
    expect(4);

    var todo = em.createEntity('TodoItem', {
        Description: 'Test',
        IsDone: false
    });
    em.saveChanges()
      .then(modAndSave)
      .then(requery)
      .then(success)
      .catch(handleFail).finally(start);

    function modAndSave(){
        // modify the existing Todo
        todo.setProperty('Description', 'Test mod 1');

        // save the first mod
        em.saveChanges().catch(handleFail);

        equal(todo.getProperty('IsDone'), false,
            "isDone is false while 1st save in progress, just before mod");

        // modify different property while the 1st save is in progress
        todo.setProperty('IsDone', true);

        // save now, before the first save response
        return em.saveChanges();
    }

    // 2nd save callback
    function requery(sr){ 
        em.clear(); // paranoia.
        return breeze.EntityQuery.from('Todos')
            .where('Id', 'eq', todo.getProperty('Id'))
            .using(em).execute();
    }

    function success(data) {
        todo = data.results[0];
        var aspect = todo.entityAspect;
        equal(aspect.entityState.name, 'Unchanged',
            "double modified Todo was saved, requeried, and is Unchanged");
        equal(todo.getProperty('Description'), 'Test mod 1',
            "description has the modified value, 'Test mod 1'");
        equal(todo.getProperty('IsDone'), true,
            "isDone has the value modified (true) during 1st save");
    }
});
当我运行这个测试并检查网络流量时,我看到三个saveChanges请求

Todo描述的创建='Test',IsDone=false

{Id:-1,Description:Test,CreatedAt:1900-01-01T08:00:00.000Z,IsDone:false}

第一次修改将一个设置描述更改为“测试模式1”

{Id:79,Description:testmod 1,CreatedAt:1900-01-01T08:00:00.000Z,IsDone:false}

第二次修改将一个设置设置为“一为真”

{Id:79,Description:testmod 1,CreatedAt:1900-01-01T08:00:00.000Z,IsDone:true}


我知道该怎么处理。给我一点时间:-你好,沃德。非常感谢新版本。非常感谢!不幸的是,我无法在我的用例中使用它。我的用例是:*Change EntityA.PropertyA*触发器1。保存*更改EntityA.PropertyB*触发器2。保存*1。如果我看一下`EntityMemo.prototype.applyAfterSave`第二个更改在memo.pendingChanges中,在第一次保存返回后,保存就完成了,但是它比较了memo.pendingChanges['PropertyB']和saved.getProperty'PropertyB的值,这在我的例子中是相等的新值。很好的用例。我考试没考到。我会努力的。敬请期待。对于您的用例:在第一次保存完成之前保存时,保存修改实体的不同修改值。考试通过了。要么我误解了您的用例,要么您没有准确地报告它。第一次保存是否可能在修改后但在第二次保存之前完成?在这种情况下,Breeze会恢复您的更改,而saveQueuing对此既不能也不应该做任何事情;请参阅此测试:保存响应覆盖在保存过程中对实体所做的更改。我想我已经用最新的修改完成了。现在,测试通过了,我又添加了一些测试。一旦你觉得我做了,请按回答做标记。