2009-08-31 10 views
2

Castle ActiveRecord/NHibernateの使用:テーブル上のすべてのクエリに対してICriterionを強制する方法はありますか?NHibernate:テーブル上のすべてのクエリに適用される条件の作成

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

すべてのクエリにWHERE句を強制的に設定する方法はありますか城ActiveRecord?

答えて

3

参照してください。 Castle ARはNHibernateフィルタへのマッピングのためのネイティブAPIを持っていないので、この部分はほとんど文書化されていません。だからここに行く。

この例のフィルタでは、あなたは関係なく、あなたはActiveRecordのに使うクエリの種類を、より古い年以上のニュースを得ることはありませんことを確認します。あなたはおそらくより実際的なアプリケーションを考えることができます。

まず、ActiveRecord "News"を作成します。

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年以上経過したエントリに決して触れません。

1

最も近いのはフィルターを使用することです。私は最終的に(フィルターを使用して)偉大な解決策を見つけたhttp://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspx

+0

これは良い解決策ですが、Castle ActiveRecordでこれらのフィルタを使用できるかどうかはわかりません。 – mbp

+0

http://groups.google.com/group/castle-project-devel/browse_thread/thread/ce94f492615e0d52/c721a7abb0a1f1a7これは今まで実装されていなかったと思います...現在のセッションを取得してフィルタを有効にする自分自身 –

+0

IIRC ActiveRecordMediator.GetSessionFactoryHolder()から現在のセッションを取得することができます。CreateSession(typeof(ActiveRecordBase)) –

関連する問題