所以我目前正在开发一个使用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属性的位置之间的代码中,我从不访问它。所以任何人都可以从中看出出了什么问题?如果您需要任何其他信息,我很乐意提供它。
此外,如果我在检索提案后直接输入保存代码,它会保存。
答案 0 :(得分:0)
我很惊讶您在saveChanges
电话中没有收到错误,因为您传入了一个对象(一个实体)而不是一组实体{{3 }}。微风应该立即给你一个错误。我告诉你我认为你应该在下面调用它。
在风格上,我想建议您使用promises而不是将回调传递给该方法。回调签名是向后兼容的东西,应该被弃用。
您真的需要指定要保存的实体吗?这被称为"樱桃选择保存"。当你需要它时它很棒但是我试图避免它,因为当你忘记保存一个应该(或许必须是)保存事务的一部分的已更改实体时它会导致细微的错误。但是,我假装您确实希望将此特定实体与所有其他可能未保存的待处理更改区分开来。
把这些想法放在一起,我认为应该看起来更像这样:
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)可以获得持久性服务,而不会在实现问题中陷入困境。这是一个强烈推荐的做法。但是,通过EntityManager
界面展示您的trService
操作只不过是一片无花果。
或者我可能一无所获......我们在这里看到的只是你试图揭示问题所以我们可以提供帮助......在这种情况下,忽略这最后的批评意见。