2010-07-16 63 views
0

的單位和我談論這個問題的映射,可以發現here :)刷新實體拋出NHibernate.UnresolvableObjectException

這裏是上下文:

我有一個父視圖 - 模型,它有助於管理一些實體,並有自己的會話。

從這個VM中,我打開另一個視圖模型(也有它自己的會話),對實體做一些更改(添加和/或刪除子項),當我驗證更改時,我提交會話併發出警告第一視圖模型刷新顯示器:

public void Validate() 
{ 
    using (var tx = Session.BeginTransaction()) 
    { 
     try 
     { 
      SelectedTeam.ClearRoster(); 

      foreach (var teamPlayer in TeamPlayers) 
       SelectedTeam.AddPlayer(teamPlayer); 

      teamsRepository.SaveOrUpdate(SelectedTeam); 

      tx.Commit(); 
     } 
     catch (Exception ex) 
     { 
      tx.Rollback(); 
     } 
     finally 
     { 
      if (tx.WasCommitted) 
       ServiceLocator.Current.GetInstance<Mediator>().NotifyColleagues(MediatorMessages.DisplayEntityInfos, SelectedTeam.Id); 
     } 
    } 
} 

這裏是父虛擬機的故障的方法:

public void RefreshEntitiesListAndDisplayEntityInfos(int selectedEntityId) 
{ 
    TEntity entity = entitiesRepository.Load(selectedEntityId); 
    Session.Refresh(entity); 
    //... 
} 

例外是在刷新線拋出:

NHibernate.UnresolvableObjectException

並且所述消息是:

具有給定標識符的行存在[Emidee.CommonEntities.PlayerInTeam#3

我可以打開和多次改變的實體,但是當我刪除一個孩子時,似乎拋出異常,然後再添加一個,最後刪除另一個。

在網絡上讀了一些東西之後,似乎是因爲當我刷新實體並且因爲我改變了HasMany關係(因爲我已經刪除了一個播放器),NH試圖重新加載刪除的行。我試圖在我的映射中的HasMany添加一個NotFound.Ignore語句,我試圖強制一個新的查詢到數據庫而不是一個負載,但我仍然得到這個異常。

有人知道我該如何解決這個問題嗎?

在此先感謝

邁克

+0

爲什麼不將使用的會話傳遞給「子」viewmodel?我認爲這將解決問題並防止重新獲取集合。 – Jay 2010-07-16 18:56:22

+0

因爲我嘗試應用ayende在這裏執行的操作:http://msdn.microsoft.com/en-us/magazine/ee819139.aspx – Mike 2010-07-16 19:45:01

回答

4

這是修改後的集合刷新對象時,已知的行爲。

要強制重新加載,請將您的方法更改爲以實體作爲參數執行session.Evict。這是我們在基本模型類中使用的代碼:

public T ReGet<T>(T entity) where T : IEntity 
{ 
    var id = entity.Id; 
    Session.Evict(entity); 
    return Session.Get<T>(id); 
} 
+0

如果另一個對象持有對舊(現在驅逐的)對象的引用並且對此做了改變。然後我得到一個NonUniqueObjectException,說我有兩個對象用於同一個ID。你知道在這種情況下該怎麼辦?謝謝。 – schoetbi 2012-05-07 13:58:23

+0

如果另一個對象修改了現在驅逐的對象,則不會發生任何事情(並且也不會更新)。當然,如果你明確地調用'session.Update(oldObject)',它可能會失敗。解決方案是......不這樣做:-)被驅逐的對象應被視爲不存在。 – 2012-05-07 14:45:02

+0

所以我需要找到所有被驅逐的引用,並將其替換爲新引用。謝謝。 – schoetbi 2012-05-08 04:17:52

0

嗯,我剛剛發現了這個問題。

要更新團隊的球員列表,我需要在更新實體之前清除列表並添加新球員。

現在,我通過刪除和添加僅由用戶移動的玩家來更新列表,而現在我沒有任何問題。

這很奇怪。我不知道什麼是錯誤的,但至少現在起作用。