2014-07-03 93 views
0

我正在密切關注John Papa關於Angular和Breeze的pluralsight課程。我也用實體框架6.BreezeJs本地查詢返回實體和空實體

在加載時,我稱之爲清除高速緩存中的首要功能:

function clearCache() { 
    var cachedParents = manager.getEntities('Parent'); // all invoices in cache 
    cachedParents.forEach(function (parent) { manager.detachEntity(parent); }); 
    zStorage.clear(); 
    manager.clear(); 
} 

,然後加載信息:

return EntityQuery.from('Parents') 
    .where('applicationUser.email', '==', userId) 
    .expand('Address, Children') 
    .toType(entityParent) 
    .using(self.manager) 
    .execute() 
    .then(querySucceeded, self._queryFailed); 

調用控制器與

[HttpGet] 
public IQueryable<Parent> Parents() 
{ 
    return _repository.Parents; 
} 

返回一個記錄...

後來,在視圖上的負載,在同一個存儲庫中,我要求父實體從本地緩存如下:

var cachedParents = EntityQuery.from('Parent') 
    .toType(entityParent) 
    .using(self.manager) 
    .executeLocally(); 

這一個帶來了兩個實體,正確的有編號,名稱,地址等,但也帶來了Id爲0的空實體。

我已經檢查過,即使在遠程查詢後立即調用本地查詢,它仍然會帶來正確的記錄和空記錄。

我也審查了響應和json對象來正確格式化,只有一個記錄。

我試過清理zstorage,實體管理器,對象的分離,但似乎沒有解釋或清除空實體。

此行爲只發生在父實體類型中。沒有其他類型顯示任何錯誤。

在此先感謝。

回答

0

調試此方法的一種方法是訂閱entityManager.hasChangesChanged事件。

添加「鬼」實體時,將觸發此事件。這樣,您可以通過在事件內部放置斷點來追蹤調用堆棧。

所以首先,確保clearCache調用後,entityManager爲空。 (附註:呼叫通過manager.detachEntity單獨分離父實體實際上是多餘的,因爲你已經停靠在年底manager.clear法)

然後,把一個斷點hasChangesChanged事件中爲您調試。

希望這會有所幫助。

0

我敢打賭,你有代碼添加一個「nullo」(id爲0的佔位符實體)到EntityManager。約翰的樣本中有這樣的代碼,你可能會無意中調用它。

爲了證明微風不加入這樣的nullo本身,

  • 設置斷點查詢

  • querySucceeded

  • 確認的頂部設置一個斷點之前在查詢「父母」之前,根本沒有緩存實體(例如,manager.getEntities()什麼都不返回)。

  • querySucceeded的頂部確認查詢結果在緩存中只有一個實體(例如,manager.getEntities()返回唯一的「父」實體)。

FWIW,沒有必要分離型「父母」的個別實體,如果你要調用manager.clear()。該呼叫將管理器緩存中的每個實體都分離出來,包括「父」類型。