1
讓我們挑選一個例子模型作爲參考:插入NHibernate的對象,而獲得其所有的孩子引用的對象
public class Cat{
public long Id;
public string Name;
public IEnumerable<Cat> Friends; //ManyToMany
}
注意,這可能是最簡單的模型,我可以形容。
目前,爲了插入新的Cat
及其Friends
,我必須首先獲取完整的持久對象。例如..
Cat sally = Repository.GetByName("Sally").First(); //The first cat named Sally
Cat mary = new Cat{ Name="Mary, Friends = new Cat[] {sally} };
Repository.Save(mary); //Which is Session.Save(mary);
只要莎莉在當前範圍內,這工作正常。但在網絡環境中,考慮到我在MVC中工作,我不一定將所有持久對象保留在內存中。想想一個頁面,我可以創建新的貓,並從多選列表中選擇孩子...
如果MVC控制器返回我只有貓的ID(這是我想要的)我不能做下面,否則我得到一個重複的條目例外
Cat mary = new Cat{ Name="Mary, Friends = new Cat[] {new Cat{ Id = 1}, new Cat{Id=2}... };
Repository.Save(mary); //Boom, because it tries to persist the new children with duplicate IDs
相反,我必須
long[] ids;
IEnumerable<Cat> friends = from cat in Repository.Query() where Id in ids select cat; //Which does a SELECT query
Cat mary = new Cat{ Name="Mary", Friends = friends };
Repository.Save(mary); //Which runs fine;
現在我的問題是:因爲在某個時間,我知道的集合的主鍵已經持續對象, 我怎麼能夠插入一個新對象,該對象引用了集合的對象而不查詢數據庫以獲取它們全部?
我明白,NHibernate有緩存,所以經常查詢Session
已知ID不會觸發完整查詢,但我想了解更多關於NHibernate的強大功能。
由於這個問題是出於示例的目的,不要介意,如果我不關心反比關係。