Я наконец-то нашел отличное решение (с использованием фильтров). Поскольку у Castle AR нет собственного API для сопоставления с фильтрами NHibernate, эта часть была в значительной степени недокументированной. Так что вот так.
Этот пример фильтра гарантирует, что вы никогда не будете получать новости старше года, независимо от того, какой запрос вы используете в ActiveRecord. Вы можете подумать о более практических приложениях для этого.
Сначала создайте 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 () и т. Д. Никогда не будут касаться записей старше года.