NHibernate:创建适用于表上所有查询的条件

时间:2009-08-31 18:27:19

标签: nhibernate criteria castle-activerecord

使用Castle ActiveRecord / NHibernate:有没有办法可以对表上的所有查询强制使用ICriterion?

例如,我的大量表格都有“UserId”列。我可能想确保我总是为登录用户选择行。我可以轻松创建一个ICriterion对象,但我不得不为不同的方法提供它:FindAll(),FindFirst(),FindLast()等。

有没有办法强制对Castle ActiveRecord的所有查询使用WHERE子句?

2 个答案:

答案 0 :(得分:3)

我终于找到了一个很好的解决方案(使用过滤器)。由于Castle AR没有用于映射到NHibernate过滤器的任何本机API,因此这部分几乎没有记录。所以这里。

此示例过滤器将确保您永远不会获得超过一年的新闻,无论您在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 :(得分:1)