Asp.net web api 使用WebApioDataAdapter,使用Breeze在同一实体上进行多个快速保存
我正在使用Breeze和EntityAction.PropertyChange上触发的自动保存机制,以及SaveQueueing扩展。这通常效果很好。 当实体发生更改时,会触发保存,并且在保存过程中会对同一实体进行另一次更改,则会出现问题。在这种情况下,另一个存储将排队。但是,一旦第一次保存完成,实体状态将变为未修改状态 是否有可能用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
更新:下面是一个测试用例的示例,它再现了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对此既不能也不应该做任何事情;请参阅此测试:保存响应覆盖在保存过程中对实体所做的更改。我想我已经用最新的修改完成了。现在,测试通过了,我又添加了一些测试。一旦你觉得我做了,请按回答做标记。