2

Castle ActiveRecord / NHibernateの使用:テーブル上のすべてのクエリにICriterionを強制する方法はありますか?

たとえば、かなりの量のテーブルに「UserId」列があります。ログインしたユーザーの行を常に選択していることを確認したい場合があります。ICriterionオブジェクトは簡単に作成できますが、FindAll()、FindFirst()、FindLast()などのさまざまなメソッドに提供する必要があります。

Castle ActiveRecordへのすべてのクエリにWHERE句を強制する方法はありますか?

4

2 に答える 2

3

私はついに素晴らしい解決策を見つけました(フィルターを使用)。Castle AR には NHibernate フィルターにマッピングするためのネイティブ API がないため、この部分はほとんど文書化されていませんでした。だからここに行きます。

この例のフィルターは、ActiveRecord でどのような種類のクエリを使用しても、1 年以上前のニュースを取得しないようにします。これについては、おそらくもっと実用的なアプリケーションを考えることができます。

まず、ActiveRecord「ニュース」を作成します。

ActiveRecordStarter を初期化する前に、次のコードを使用します。

ActiveRecordStarter.MappingRegisteredInConfiguration += MappingRegisteredInConfiguration;
Castle.ActiveRecord.Framework.InterceptorFactory.Create = () => { return new EnableFiltersInterceptor(); };

次に、不足している関数とクラスを追加します。

void MappingRegisteredInConfiguration(Castle.ActiveRecord.Framework.ISessionFactoryHolder holder)
{
    var cfg = holder.GetConfiguration(typeof (ActiveRecordBase));

    var typeParameters = new Dictionary<string, IType>
                                  {
                                    {"AsOfDate", NHibernateUtil.DateTime}
                                  };

    cfg.AddFilterDefinition(new FilterDefinition("Latest", "", typeParameters));

    var mappings = cfg.CreateMappings(Dialect.GetDialect(cfg.Properties));

    var newsMapping = cfg.GetClassMapping(typeof (News));
    newsMapping.AddFilter("Latest", ":AsOfDate <= Date");
}


public class EnableFiltersInterceptor : EmptyInterceptor
{
    public override void SetSession(ISession session)
    {
        session.EnableFilter("Latest").SetParameter("AsOfDate", DateTime.Now.AddYears(-1));
    }
}

そして出来上がり!FindAll()、DeleteAll()、FindOne()、Exists() などのニュースに関するクエリは、1 年以上前のエントリには触れません。

于 2009-09-03T21:07:02.850 に答える
1

最も近いのはフィルターを使用することです。http://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspxを参照してください。

于 2009-08-31T19:11:35.847 に答える