Nhibernate映射Parent的最佳方法>儿童

时间:2012-07-12 04:54:39

标签: c# nhibernate parent-child fluent-nhibernate-mapping

我是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; }
}

我使用Fluent的映射:

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只会从NHibernate调用ISession.Load。也许我错了,但Load此时并未点击数据库。

我的问题是我正在做的事情是否正确。 在这种情况下,如果我在ClientModel中直接更新了一些属性IntegratorID,那会不会更容易?

因为,在我的架构中,我必须调用我的BLL of Integrator,调用Load然后在ClientModel属性中设置返回值。

这段代码有效,但由于我是Nhibernate的新手,我认为可能还有另一种方法可以做得更好。

2 个答案:

答案 0 :(得分:1)

session.Load()适用于这种情况,并且具有以下优点:您获得的objectproxy就像真实对象一样,因此当仅设置id和您时,您没有损坏的模型我想稍后使用clientmodels集成商。它也不会中断更改跟踪,因为NHib无法在null > not initialisednull > references nothing之间分隔

总结:这是使用(N)Hibernate处理此问题的正确方法。

答案 1 :(得分:0)

代码没问题。更改实体后无需调用Save。 NHibernate自己查找更改并在提交会话时将所有更改传播到数据库。