在saveChanges调用之后,Breeze EntityManager不会更改实体状态

时间:2013-10-08 13:35:45

标签: breeze

我正在努力解决saveChanges方法的问题。

似乎saveChanges保留了之前的实体状态,并且在服务器上进行的更改不会因此而反映在客户端上。我尝试了两种合并策略,结果是一样的。

我像这样初始化经理:

var manager = new breeze.EntityManager({ serviceName: serviceUrl });

然后我得到了我需要在并行调用中使用的所有实体。

        manager.fetchMetadata()
            .then(function() {
                store.registerEntityTypeCtor("GameGroup", GameGroup);
                store.registerEntityTypeCtor("Game", Game);
                store.registerEntityTypeCtor("LimitGroup", LimitGroup, LimitGroupInitializer);
                store.registerEntityTypeCtor("Limit", Limit, LimitInitializer);

                addValidators();
                subscribeToStateChanges();
            })
            .then(function() {
                return Q.all([
                    getEntitiesByQuery(gamesQuery, model.games),
                    getEntitiesByQuery(gameGroupsQuery, model.gameGroups),
                    getEntitiesByQuery(limitsQuery, model.limits),
                    getEntitiesByQuery(limitGroupsQuery, model.limitGroups)]);
            })
            .then(function() {
                handlers.onSuccess();
            })
            .fail(function () {
                handlers.onFail();
            });

        function getEntitiesByQuery(query, modelProperty) {
            manager.executeQuery(query)
                .then(function (data) {
                    modelProperty(data.results);
                });
        }

但是,让我们说我们想要改变一些实体的财产: 这是一个控制台日志:

manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Unchanged"
manager.getEntities('LimitGroup')[0].Name('SomeName')
LimitGroup
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Modified"
manager.hasChanges()
true
manager.saveChanges().done();
undefined
manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
"Modified"

如您所见,saveChanges调用后状态仍为“已修改”。 对我所做名称的更改已保存到数据库中,除此之外的所有内容似乎都正常工作。 同样的事情发生在'添加'实体上,但是,如果我在某个实体上调用setDeleted方法,它将在调用后立即设置为'Detached',并且无法在管理器的缓存中找到。

我查看了一些微风的例子,他们没有相同的问题,可能是什么问题?

谢谢!

更新#1

以下是saveChanges的调用方式:

        self.showBusy();

        manager.saveChanges()
            .then(function (data) {
                self.hideBusy();
                console.log(manager.getEntities('LimitGroup')[0].entityAspect.entityState.name);
            })
            .fail(saveFailed);

同样,实体状态显示为“已修改”

更新#2

所以我用done()调用替换then(),结果是一样的。

manager.saveChanges()
            .done(function(data) {
                self.hideBusy();
                console.log(manager.getEntities('LimitGroup')[0].entityAspect.entityState.name);
            });

2 个答案:

答案 0 :(得分:1)

以下代码无效,因为您需要将函数传递给完成调用,然后在收到回调后检查该点的entitiesState。

manager.saveChanges().done(checkStates);

function checkStates() {
    manager.getEntities('LimitGroup')[0].entityAspect.entityState.name
}

这将等到在检查entityState之前返回saveChanges回调。

答案 1 :(得分:0)

问题是我没有用BreezeController属性标记api控制器。