2010-07-07 63 views
0

我的富客戶端應用程序中出現了一個奇怪的問題。這裏有一些背景:獲取在另一個會話中被修改的實體時出現問題

  • 我使用每個視圖模型一個會話。
  • 我的觀點模型與Mediator彼此溝通。

我有一個管理視圖模型,其中顯示我的實體列表。我可以編輯一個實體,導致打開一個新的視圖模型,該模型接收通過介體編輯的實體的ID。

當用戶點擊編輯按鈕時,我的編輯視圖模型會使用自己的會話更新實體,並再次使用媒體編輯器和編輯的實體標識來要求主視圖模型刷新實體列表。

比方說,我更改了實體上名爲Visible的布爾屬性。

當我編輯實體時,我可以看到對NHibernate的UPDATE調用,更新數據庫中的實體。

等我回來時在主視圖模型,我做兩件事情:

  1. 我從NHibernate的要求更新實體
  2. 我刷新實體的列表,顯示所有的實體,與自定義過濾器。 (顯示所有例如可見的實體。)

有什麼奇怪的是,我從NH在第一時間拿到指令的實體仍然具有Visible屬性的舊值,但在我看到的實體列表中,實體我已經編輯不存在...

這裏是倉庫的兩個功能我用它來分別獲得實體,並得到所有可見的實體列表:

public virtual TEntity Get(int id) 
{ 
    return Session.Get<TEntity>(id); 
} 

public IEnumerable<Player> GetAllPlayersSortedByLastName(bool visible = true) 
{ 
    return from player in Session.Linq<Player>() 
      where player.Visible == visible 
      orderby player.LastName 
      select player; 
} 

這有什麼錯我的代碼?爲什麼我在主視圖模型編輯後從NH返回的實體沒有正確的值?

在此先感謝

回答

3

你在每個視圖模型的終身保持的Isession活着嗎?

如果是這種情況 - 實體存在於MainViewModel的ISession的IdentityMap中 - 所以當您要求它刷新時 - 它只抓取IdentityMap中的一個。

你需要ISession.Evict(updatedEntity)然後再次運行你的查詢。

這是ISession的(第1級緩存的整體思路,如果它先前已加載未命中數據庫

如果不希望這種行爲,並希望繞過一級高速緩存 - 你可以從會話中打開子會話 - 或者在IStatelessSession中運行。

+1

或ISession.Refresh(obj)。 – 2010-07-07 13:04:06

+0

我已經在我的主視圖模型中使用了無狀態會話。 但我解決了我的問題,通過做Session.Get (entityId),然後Session.Refresh(entity),就像Jamie說的。 – Mike 2010-07-07 13:32:21

相關問題