2013-10-31 26 views
2

我最近重構了我的域模型以刪除由導航屬性導致的循環引用。這裏是域模型的基本結構:導航屬性並避免循環引用

  • 用戶有很多遊戲
  • 遊戲中有許多UserTeams
  • 用戶有很多UserTeams

以前我曾在UserTeam模型導航屬性,用戶。

爲了避免循環引用(我在使用autofixture進行單元測試時遇到問題),我從UserTeam中刪除了User navigation屬性。

以前,在我看來,通過遊戲循環的時候,我能得到用戶的UserTeam像這樣:

foreach (game in games) 
{ 
    foreach (userteam in game) 
    { 
     userteam.User.UserName 
    } 
} 

現在,我不能這樣做(因爲用戶不再UserTeam的屬性)。

所以,現在我必須從視圖調用一個方法,就像GetUser(userteam.UserId)

與以前的結構相比,這似乎效率很低(必須對每個循環迭代進行數據訪問)。

有沒有更好的方法?

+0

也許視圖模型可以幫到你嗎? – JLe

+0

如何?看起來我需要一個新模型(viewmodel)來模仿舊模型(循環引用)和一套新的存儲庫方法......所以我只是迴避了循環引用問題...... 。 – jag

+0

好吧,更好的方法是讓循環引用回到'User'。在你的模型中不一定有什麼不好的。你不能忽略自動混合中的屬性?我的意思是,如果你想知道UserTeam的用戶名,你需要用戶參考,這很簡單。使用視圖模型,您可以稍微扁平化,也可以直接將用戶名添加到UserTeam。 – JLe

回答

0

爲了避免循環引用(我在使用自動混合的單元測試時遇到問題),我從UserTeam中刪除了User導航屬性。

有沒有更好的方法?

  1. 如果你離開User屬性爲Game類,你可以使用的,而不是Game.UserUserTeam.User訪問User

  2. 如果您要刪除只是每個循環參考有選項。

每個雙向關聯(例如,User <-> Game)都會產生循環依賴關係。

要刪除循環依賴關聯,必須使用關聯結束刪除選項的單向(例如,User <- GameUser -> Game)。

所以,而不是從Game類刪除User屬性它可能更適合從User類中刪除Games財產,並添加服務方法GetGames(User)哪些查詢在一次調用所有的遊戲。