2009-08-31 4 views
2

모든 쿼리에 적용되는 기준을 만들기?NHibernate에 : 당신이 테이블에 모든 쿼리에 ICriterion을 강제 할 수있는 방법이 있나요 : 성 액티브/자 NHibernate를 사용하여 테이블

예를 들어, 내 테이블의 좋은 금액은 "사용자 아이디"열이 있습니다. 나는 항상 로그인 한 사용자의 행을 선택하고 싶을 것이다. ICriterion 개체를 쉽게 만들 수 있지만 FindAll(), FindFirst(), FindLast() 등 여러 가지 메서드를 제공해야합니다.

모든 쿼리에 대해 WHERE 절을 강제로 사용할 수 있습니까? 성 ActiveRecord?

답변

3

참조하십시오. 캐슬 AR은 NHibernate 필터에 매핑하기위한 네이티브 API를 가지고 있지 않기 때문에,이 부분은 거의 문서화되지 않았다. 그래서 여기에 간다.

이 예 필터, 당신이 상관없이 당신이 액티브에 사용하는 쿼리의 종류, 년 이상 뉴스 오래된 얻을하지 않습니다 있는지 확인합니다. 당신은 아마 이것에 대한 더 실용적인 응용 프로그램을 생각할 수 있습니다.

먼저 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 년 이상 만지지 않습니다.

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 ... 당신은 현재 ISession를 얻을 수 있고 필터를 가능하게합니다 자신을 –

+0

IIRC 당신은 필터를 사용 ActiveRecordMediator.GetSessionFactoryHolder에서 현재 ISession(). CreateSession (대해서 typeof (ActiveRecordBase)) –