2012-07-12 36 views
0

我是NHibernate的新手,我有些疑惑。我會把我的代碼放在下面,然後我會解釋。Nhibernate映射的最佳方式父>兒童

我的表: https://dl.dropbox.com/u/423844/map%20db.png

我的課:使用

public class IntegratorModel : PGIBaseModel<int>, IIntegratorModel 
{ 
    public virtual string Identifier { get; set; } 

    public virtual string Name { get; set; } 

    public virtual string Description { get; set; } 
} 

public class ClientModel : PGIBaseModel<int>, IClientModel 
{ 
    public virtual string Name { get; set; } 

    public virtual string TokenPGI { get; set; } 

    public virtual IIntegratorModel Integrator { get; set; } 
} 

我的映射流利的:

public class IntegratorMappingOverride : IAutoMappingOverride<IntegratorModel> 
{ 
    public virtual void Override(AutoMapping<IntegratorModel> mapping) 
    { 
     mapping.Map(model => model.Identifier).Column("Identifier").Length(4); 
     mapping.Map(model => model.Name).Column("Name").Length(200); 
     mapping.Map(model => model.Description).Column("Description").Length(2000); 
    } 
} 

    public class ClientMappingOverride : IAutoMappingOverride<ClientModel> 
{ 
    public virtual void Override(AutoMapping<ClientModel> mapping) 
    { 
     mapping.Map(model => model.Name).Column("Name").Length(200); 
     mapping.Map(model => model.TokenPGI).Column("TokenPGI").Length(50); 

     mapping.References<IntegratorModel>(model => model.Integrator); 
    } 
} 

我節省IntegratorModel以前在另一時刻,所以當我插入一個新的ClientModel我已經有了IntegratorID,所以沒關係。

我的問題是,當我更新ClientModel,我想改變IntegratorID在數據庫中,我在做這樣的事情:

IClientModel model = this.GetModelFromPost(); 
    model.Integrator = integratorBLL.LoadByID(context.Request.Form["IntegratorID"])); 
    clientBLL.Save(model); 

integratorBLL.LoadByID只是會叫ISession.Load從NHibernate的。也許我錯了,但Load在這一刻不會觸及數據庫。

我的問題是如果我在做什麼是正確的。 在這種情況下,如果我在ClientModel中直接更新了一些屬性IntegratorID,會不會更容易?

原因,在我的architeture中,我必須調用BLL的Integrator,調用Load,然後在ClientModel屬性中設置返回值。

此代碼有效,但因爲我是Nhibernate的新手,我認爲可能還有另一種更好的方法。

回答

1

session.Load()是爲這種情況下,有你得到objectproxy行爲像真實對象,以便僅設置ID,當你沒有一個斷模式的優勢,你想以後使用clientmodels積分。它也不會破裂變化的跟蹤,因爲NHib不能單獨null > not initialisednull > references nothing

之間

綜上所述:這是(N)Hibernate來處理這個問題的正確方法。

+0

Thnks!我試圖學習NHibernate在我的公司介紹,並且我想以最好的方式來完成。 – japoneizo 2012-07-12 15:33:32

0

代碼沒問題。更改實體後不需要調用Save。當提交會話時,NHibernate自己發現所做的更改並將所有更改傳播到數據庫。

+0

謝謝@ stefan-steinegger,我現在要重構我的代碼。 – japoneizo 2012-07-12 15:37:11