我已經構建我的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 };
是否有另一種方式來實現我想要做的沒有擊中數據庫的實體?
我是否應該咬緊牙關並映射外鍵以及關係?
還是我正在關心數據庫的旅行,我應該只是打擊?
好的,這絕對回答了我的問題,但我現在正努力將其融入我的設計中。我的控制器使用我的業務層中的服務類,它在我的數據層中使用存儲庫。我應該將Load()方法添加到我的存儲庫,然後在我的服務中使用CreateThing(stuffId,whatId,blahId)方法嗎? – littlecharva
有時你可以在庫中抽象出NH的好處,在這種情況下,我會公開會話,以便利用NH帶來的所有優點。我有一個通用的'服務'層,它具有類似以下內容: - public ISession Db { 獲取 {0}返回SessionFactory.GetCurrentSession(); (w => w.Name =='Richard') – Rippo
你知道嗎?如果這從2013年以來一直得到增強?這是一個非常常見的用例和一個奇怪的解決方案來解決它。我會假設Fluent Nhibernate會爲此提供一些東西。 –