【问题标题】:Why is this entity not saving? [BreezeJS/AngularJS]为什么这个实体不保存? [BreezeJS/AngularJS]
【发布时间】:2015-04-09 03:06:21
【问题描述】:

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

所以我猜由于某种原因它失去了与 Breeze 或其他东西的绑定。我所做的更改会反映在页面上,所以我认为 Angular 仍然“看到”它。

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

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 事物)。然后是我在批准/保存时的功能:

$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 属性之间的代码中,我从不访问它。那么任何人都可以从中看出哪里出了问题吗?如果您需要任何其他信息,我很乐意提供。

另外,如果我在检索到它确实保存的提案后直接输入保存代码。

【问题讨论】:

    标签: angularjs entity-framework breeze


    【解决方案1】:

    我很惊讶您在saveChanges 调用中没有收到错误,因为您传入的是一个对象(一个实体)而不是一组实体as the API requires。 Breeze 应该立即给你一个错误。我向你展示了我认为你应该如何在下面调用它。

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

    您真的需要指定要保存的实体吗?这被称为“樱桃采摘保存”。当您需要它时它很好,但我尽量避免它,因为当您忘记保存应该是(也许必须是)保存事务的一部分的已更改实体时,它可能会导致微妙的错误。但是,我会假装您确实想要将此特定实体与所有其他可能未保存的待处理更改区分开来。

    把这些想法放在一起,我觉得应该更像这样:

    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 的交互,以便消费者(例如,控制器/ViewModel)可以获得持久性服务,而不会因实现问题而陷入困境。这是一个强烈推荐的做法。但是通过trService 接口暴露你的EntityManager 操作只是一个遮羞布,你不觉得吗。

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

    【讨论】:

    • 感谢您的广泛回答。我可能应该提到的是,这是一个我正在继续的项目,这里提到的 saveChanges() 在调用 Breeze 的 saveChanges 之前做了一些额外的事情。我'cherrypicking'的原因是我同时在编辑另一个不应该保存的实体。是的,该服务正在运行。实际上我最终决定为此选择其他路径。
    • 那么一切都好吗?我放心了。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多