我是NHibernate的新手,我有些疑惑。我会把我的代码放在下面,然后我会解释。
我的桌子:
我的课程:
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的新手,我认为可能还有另一种方法可以做得更好。
答案 0 :(得分:1)
session.Load()
适用于这种情况,并且具有以下优点:您获得的objectproxy就像真实对象一样,因此当仅设置id和您时,您没有损坏的模型我想稍后使用clientmodels集成商。它也不会中断更改跟踪,因为NHib无法在null > not initialised
和null > references nothing
之间分隔
总结:这是使用(N)Hibernate处理此问题的正确方法。
答案 1 :(得分:0)
代码没问题。更改实体后无需调用Save。 NHibernate自己查找更改并在提交会话时将所有更改传播到数据库。