2013-05-04 78 views
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的強大功能。

由於這個問題是出於示例的目的,不要介意,如果我不關心反比關係。

回答

1

由於您擁有ID,因此您只需使用session.Load即可獲取引用,而無需從數據庫中加載引用。

你的第二個行只是更改爲以下:

var friends = from id in ids select session.Load<Cat>(id); 
相關問題