2015-04-07 60 views
1

所以我目前正在使用實體框架,Breeze和Angular的項目,現在我卡住了。我檢索一個實體,更改一個屬性,然後嘗試保存。但即使EntityState指出它已被修改,它也不會保存。爲什麼這個實體沒有保存? [BreezeJS/AngularJS]

所以我猜出於某種原因,它失去了它對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

我很驚訝你沒有在你的saveChanges調用中出錯,因爲你傳遞的是一個對象(實體)而不是實體數組as the API requires。微風應該立即給你一個錯誤。我向你展示我如何認爲你應該把它叫做下面。

在風格上,我想建議您使用承諾而不是將回調傳遞給方法。回調簽名是一個向後兼容的東西,應該真的被棄用。

您是否確實需要指定要保存的實體?這被稱爲「櫻桃採摘保存」。當你需要它的時候它很棒,但是我儘量避免它,因爲當你忘記保存一個應該(或許必須)保存事務的變化的實體時,它會導致細微的錯誤。不過,我會假裝你真的要想要保存這個特定的實體,而不是所有其他可能未保存的未決更改。

把這些想法在一起,我認爲它應該看起來更像是這樣的:

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操作只是一個無花果葉,你不覺得。

或者我可能無所事事......我們在這裏看到的只是你試圖揭示問題,所以我們可以幫助...在這種情況下,忽略最後的批評意見。

+0

感謝您的廣泛答覆。我可能應該提到的是,這是一個我剛剛繼續的項目,在調用Breeze的saveChanges之前,這裏提到的saveChanges()會做一些額外的工作。 我是'櫻桃'的原因是,我在同一時間編輯一個不應該保存的其他實體。是的,該服務正在工作。 我實際上決定爲此選擇其他路徑。 – Peter

+0

那麼一切都好?我放心了。快樂的編碼! – Ward

相關問題