0

我是 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 e 中直接更新了一些属性 IntegratorID 会不会更容易?

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

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

4

2 回答 2

1

session.Load()适用于这种情况,并且具有您获得的 objectproxy 的行为类似于真实对象的优点,因此当您仅设置 id 并且您想稍后使用 clientmodels 集成器时,您没有损坏的模型。它也不会中断更改跟踪,因为 NHib 不能在null > not initialised和之间分开null > references nothing

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

于 2012-07-12T08:44:43.270 回答
0

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

于 2012-07-12T09:01:38.377 回答