NHibernate: создание критерия, который применяется ко всем запросам в таблице - PullRequest
2 голосов
/ 31 августа 2009

Использование Castle ActiveRecord / NHibernate: Есть ли способ, которым вы можете навязать ICriterion для всех запросов к таблице?

Например, у большого количества моих таблиц есть столбец "UserId". Я мог бы убедиться, что я всегда выбираю строки для вошедшего в систему пользователя. Я могу легко создать объект ICriterion, но я вынужден предоставить его для различных методов: FindAll (), FindFirst (), FindLast () и т. Д.

Есть ли способ принудительно использовать предложение WHERE для всех запросов в Castle ActiveRecord?

Ответы [ 2 ]

3 голосов
/ 04 сентября 2009

Я наконец-то нашел отличное решение (с использованием фильтров). Поскольку у 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 () и т. Д. Никогда не будут касаться записей старше года.

1 голос
/ 31 августа 2009

Самое близкое было бы использовать фильтры. Смотри http://ayende.com/Blog/archive/2009/05/04/nhibernate-filters.aspx

...