1

DefaultDeleteEventListener と DefaultLoadEventListener をオーバーライドすると、Nhibernate を使用してソフト削除可能オブジェクトを実装するための非常に優れたソリューションが提供されました。

 public class SoftDeletableLoadEventListener : DefaultLoadEventListener
    {
        #region Non-public members

        protected override object DoLoad(LoadEvent @event,
            IEntityPersister persister, EntityKey keyToLoad,
            LoadType options)
        {
            object entity = base.DoLoad(@event, persister, keyToLoad, options);

            var softEntity = entity as ISoftDeletable;

            if (softEntity != null && softEntity.IsDeleted)
            {
                if (options == LoadEventListener.ImmediateLoad
                    || options == LoadEventListener.Load)
                {
                    string msg =
                        string.Format("Can not Load soft deleted entity typeof({0}) with Id {1} as it was deleted.",
                            softEntity.GetType().Name,
                            softEntity.Id);

                    throw new InvalidOperationException(msg);
                }
            }

            return entity;
        }

        #endregion
    }

DefaultLoadEventListener の要約として次のように述べています

これは、ExtraLazyLoading を実行するときにフィルターが適用されないことを意味します。その結果、たとえば、削除されたエンティティがカウントされます。クエリ中にソフト削除可能フィルターを適用する別の方法はありますか? 常に手動で制限を追加してフィルタリングするよりも良い方法はありますか?

4

1 に答える 1

2

DefaultLoadEventListener をオーバーライドせずに nh を使用してソフト削除を実装しましたが、コレクションのロード戦略も役立つと思います。コレクションに where 句の仕様を追加できます。

流暢な NHibernate

.Override<Parent>(map =>
{
    map.HasMany<Child>(p => p.Children)
        .Where("IsDeleted = 0");
})

HBM.xml

<bag name="Children" where="IsDeleted = 0">
  <key>
    <column name="ParentID" />
  </key>
  <one-to-many class="Child" />
</bag>

edit上書きされた DefaultLoadEventListener を使用し、where 句の仕様を使用して選択をフィルタリングすることを推奨する nhibernate.info からのソフト削除に関するこのリンクを 見つけました。

于 2013-01-10T00:05:21.003 に答える