2013-06-03 51 views
1

我已經構建我的NHibernate的模型來隱藏外鍵ID作爲似乎是最好的做法,這樣反而兼具的關係,並仿照這樣的關鍵:NHibernate的:填充新的實體的外鍵ID相對性能

public class CompanyOffice 
{ 
    public virtual int Id { get; set; } 
    public virtual int CompanyId { get; set; } 
    public virtual Company Company { get; set; } 
} 

我只是有:

public class CompanyOffice 
{ 
    public virtual int Id { get; set; } 
    public virtual Company Company { get; set; } 
} 

而讓NHibernate的負責剩下的車。我喜歡這一點,但我有需要的設定,當我創建一個新的實體,在MVC動作,我在做這個的多個外鍵幾個表:

public ActionResult CreateNewThing(int stuffId, int whatId, int blahId) 
{ 
    var stuff = _service.GetStuffById(stuffId); 
    var what = _service.GetWhatById(whatId); 
    var blah = _service.GetBlahById(blahId); 

    var thing = new Thing { Stuff = stuff, What = what, Blah = blah }; 
} 

這意味着三趟到該數據庫以獲得實體的時候我並不真的需要它們,因爲我已經有ID和可能只是做:

var thing = new Thing { StuffId = stuffId, WhatId = whatId, BlahId = blahId }; 

是否有另一種方式來實現我想要做的沒有擊中數據庫的實體?
我是否應該咬緊牙關並映射外鍵以及關係?
還是我正在關心數據庫的旅行,我應該只是打擊?

回答

3

你是正確的,以避免映射FK標識,以避免3個addtional車次做到這一點: -

var thing = new Thing { 
    Stuff = session.Load<Stuff>(20), 
    What = session.Load<What>(21), 
    Blah = session.Load<Blah>(2234), 
} 

session.Loadsession.Get

略有不同的另外值得一提的是Thing.Stuff.Id也沒有擊中數據庫。

這是一個great post,我引用: -

在session.load(),Hibernate不會訪問數據庫(在輸出中沒有選擇 語句)來檢索股票對象,它會返回一個 股票代理對象 - 具有給定標識值的虛假對象。在此 方案中,代理對象足以保存股票交易記錄 。

+1

好的,這絕對回答了我的問題,但我現在正努力將其融入我的設計中。我的控制器使用我的業務層中的服務類,它在我的數據層中使用存儲庫。我應該將Load()方法添加到我的存儲庫,然後在我的服務中使用CreateThing(stuffId,whatId,blahId)方法嗎? – littlecharva

+0

有時你可以在庫中抽象出NH的好處,在這種情況下,我會公開會話,以便利用NH帶來的所有優點。我有一個通用的'服務'層,它具有類似以下內容: - public ISession Db { 獲取 {0}返回SessionFactory.GetCurrentSession(); (w => w.Name =='Richard') – Rippo

+0

你知道嗎?如果這從2013年以來一直得到增強?這是一個非常常見的用例和一個奇怪的解決方案來解決它。我會假設Fluent Nhibernate會爲此提供一些東西。 –