私は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 はデータベースにヒットしていません。
私の質問は、私がやっていることは正しいかどうかです。この場合、いくつかのプロパティ IntegratorID を ClientModel に直接持っていて、それを更新しただけでは簡単ではないでしょうか?
私のアーキテクチャでは、Integrator の BLL を呼び出し、Load を呼び出してから、ClientModel プロパティに戻り値を設定する必要があります。
このコードは機能しますが、私は Nhibernate を初めて使用するため、おそらく別の方法でより適切に実行できると思います。