7

多くの SubArea 子を持つ Area オブジェクトがあります。

public class Area
{
    ...
    public virtual IList<SubArea> SubAreas { get; set; } 
}

子は一方向の非反転関係としてマッピングされます。

public class AreaMapping : ClassMap<Area>
{
    public AreaMapping()
    {
        HasMany(x => x. SubAreas).Not.Inverse().Cascade.AllDeleteOrphan();
    }
}

エリアは私の集約ルートです。領域 (例: Session.Save(area) ) を保存すると、領域が保存され、子 SubArea が自動的にカスケードされます。

保存または更新イベント リスナーを追加して、エリアやサブエリアが永続化されるたびにキャッチしたいと考えています。たとえば、5 つのサブエリアがあるエリアがあるとします。SaveEventListeners にフックすると、次のようになります。

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };

エリアを保存すると、Mylistener はエリアに対して1 回だけ起動されます (サブエリアは無視されます)。イベントリスナーで5つのサブエリアもキャッチしたい。代わりに SaveOrUpdateEventListeners にフックすると:

Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };

領域を保存すると、Mylistener はまったく起動しません。奇妙なことに、SaveEventListenersとSaveOrUpdateEventListenersにフックすると、次のようになります。

Configuration.EventListeners.SaveEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };
Configuration.EventListeners.SaveOrUpdateEventListeners = 
    new ISaveOrUpdateEventListener[] { mylistener };

エリアを保存すると、Mylistener が11 回起動されます。エリアごとに 1 回、サブエリアごとに 2 回です。(NHIbernate が SubArea を INSERT してから、エリアの外部キーで UPDATING しているためだと思います)。

ここで私が間違っていること、および各エリアとサブエリアに対してリスナーを1回起動させる方法を知っている人はいますか?

4

2 に答える 2

0

質問に100%関連しているわけではありませんが、コレクションでinverse = "true"を使用してマップする場合、少なくとも挿入および更新ステートメントを取得しないでください。

于 2009-12-29T11:20:54.483 に答える
0

NH は、オブジェクトの ID がわからない場合 (IDENTITY や SEQUENCE など)、それを知るために INSERT ステートメントを発行します。

したがって、無効にしたい場合は、DB へのラウンドトリップを必要としない ID ジェネレーター (guid や guid.combo など) を使用する必要があります。

于 2010-05-14T11:34:47.953 に答える