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 はデータベースにヒットしていません。

私の質問は、私がやっていることは正しいかどうかです。この場合、いくつかのプロパティ IntegratorID を ClientModel に直接持っていて、それを更新しただけでは簡単ではないでしょうか?

私のアーキテクチャでは、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 に答える