2010-07-15 47 views
1

這是一個新問題,提前抱歉。自動更新NHibernate的一對多關係的兩端

我使用流利的NHibernate並得到一個奇怪的行爲。

我有一個看起來像(簡體)兩大類:

public class Group 
{ 
    public virtual int Id{get;protected set;} 
    public virtual String Name{get;set;} 
    public virtual List<Person> Persons {get; protected set;} 
} 

public class Person 
{ 
    public virtual int Id{get;protected set;} 
    public virtual String Name{get;set} 
    public virtual Group Group {get;set;} 
} 

而且映射 組:

Id(x=>x.Id) 
Map(x=>x.Name) 
HasMany(x=>x.Persons).Cascade.All.Inverse() 

人:

Id(x=>x.Id) 
Map(x=>x.Name) 
References(x=>x.Group) 

現在,在我的代碼我想把一個人移到另一個小組。既然是有關係的,我想我可以簡單地做

myPerson.Group = anotherGroup; 
_mySession.SaveOrUpdate(myPerson); 
_mySession.Flush() 

如果我這樣做,數據庫被正確更新,但如果我嘗試的對象「anotherGroup」的人員名單看我不t看到對象「myPerson」,它仍然在舊組的人員列表中。

那麼,有沒有辦法告訴NH重新加載列表,或使其始終更新。

,我現在已經找到了唯一的解決方法是這樣的:

myPerson.Group.Persons.Remove(myPerson); 
anotherGroup.Persons.Add(myPerson); 
myPerson.Group = anotherGroup; 
_mySession.Flush() 

但我覺得有點髒......

什麼我做錯了任何想法?謝謝!

回答

3

使用幫助器方法來簡化這個;在組你想要的線沿線的東西:

RemovePerson(person) 
AddPerson(person) 

您可能會發現更多的指導,這篇文章有幫助的:Strengthening your domain: Encapsulated collections

+0

嗯,實際上這就是我現在所做的,我沒有在這裏展示過他們的簡化,但我認爲NH會爲我做這件事,對不對? 感謝您的鏈接,非常有趣。 – Gimly 2010-07-15 12:30:26

+0

@Gimly - 不幸的是,保持這些關係是你的責任。 – DanP 2010-07-15 12:35:43

+0

爲什麼會出現這種情況的提示?我認爲在Linq2Sql中這些關係是自動的。未來的版本會改變嗎? – Gimly 2010-07-15 12:59:08

2

@簡單地說,L2S中的關係是自動的,因爲它使用自定義集合(NHibernate與標準接口一起工作,並且可以在將它實例化爲List之後保留集合)。然而,有一些關於如何改善這種情況的非正式討論,但沒有任何關於主幹的討論,因爲它具有非常低的優先級,考慮到簡單的解決方法(上面的答案)

+0

我希望你或法比奧會在鳴謝,感謝您的確認 – DanP 2010-07-15 22:27:10

+0

感謝您的洞察力,總是有趣的知道這樣的選擇背後的原因。 – Gimly 2010-07-17 08:46:23

+0

無論如何,不​​要把我的話作爲規範,我只是一個熱情的用戶:-) – 2010-07-17 11:57:52