为什么这个实体不保存? [BreezeJS/AngularJS]

Why is this entity not saving? [BreezeJS/AngularJS]

所以我目前正在从事一个使用 Entity Framework、Breeze 和 Angular 的项目,但现在我被困住了。我检索了一个实体,更改了 属性,然后尝试保存它。但即使 EntityState 表明它已被修改,它也不会保存。

所以我猜出于某种原因它失去了与 Breeze 或其他东西的绑定。我所做的更改反映在页面上,所以我想 Angular 仍然 'sees' 它。

这是来自我的控制器的相关代码:

trService.getProposalById($route.current.params.Id)
    .then(function (query) {
        $scope.proposal = query.results[0];
        trService.getTrById($scope.proposal.TrID)
        .then(function (query) {
            $scope.itinerary = query.results[0];
        })
        .then(function (query) {
            //Something irrelevant
        });
    });

在此之后检查 $scope.proposal 表明它是一个实体(ctor.proto 东西)。然后是我 approving/saving:

时的函数
$scope.onApproveConfirm = function () {

        console.log("Before: " + $scope.proposal.entityAspect.entityState.name);
        $scope.proposal.IsApproved = 2;
        console.log("After: " + $scope.proposal.entityAspect.entityState.name);

        trService.saveChanges($scope.proposal, undefined, function (result) {
            console.log("Saved: " + result.entities.length);
        }, function () {
            console.log("Save failed");
        });
    };

控制台中的输出如下所示:

Before: Unchanged
After: Modified
Saved: 0

我对所有其他实体使用 saveChanges 没有任何问题。在检索提案和更改 IsApproved 属性 之间的代码中,我从未访问过它。那么任何人都可以从中看出哪里出了问题吗?如果您需要任何其他信息,我很乐意提供。

此外,如果我在检索提案后直接输入保存代码,它会保存。

我很惊讶您在 saveChanges 调用中没有收到错误,因为您传递的是 object(实体)而不是实体数组 as the API requires. Breeze 应该立即给你一个错误。我告诉你我认为你应该如何在下面称呼它。

在风格上,我想建议您使用承诺而不是将回调传递给方法。回调签名是一个向后兼容的东西,真的应该被弃用。

您真的需要指定要保存的实体吗?这叫做"cherry picking the save"。当你需要它时它很棒,但我尽量避免它,因为当你忘记保存应该(可能必须是)保存事务的一部分的更改实体时,它会导致细微的错误。但是,我会假装您真的想要将这个特定实体与所有其他可能未保存的待定更改分开保存。

将这些想法放在一起,我认为它应该看起来更像这样:

trService.saveChanges([$scope.proposal]) // <--- note the array
    .then(function (result) {
        console.log("Saved: " + result.entities.length);
    })
    .catch(function (error) {
        console.log("Save failed: " + error.message);
    });

最后一个问题。您的服务适合您吗?它似乎暴露了您与 Breeze 交互方式的内部结构。 拥有这样的数据服务的通常原因是封装与Breeze的交互,以便消费者(例如,controller/ViewModel)可以获得持久性服务w/o 陷入实施问题。这是强烈推荐的做法。但是通过 trService 接口公开你的 EntityManager 操作只是一块遮羞布你不觉得吗。

或者我可能是白担心了...而我们在这里看到的只是您试图揭示问题以便我们提供帮助...在这种情况下,请忽略最后一条批评意见。