使用Castle ActiveRecord / NHibernate:有没有办法可以对表上的所有查询强制使用ICriterion?
例如,我的大量表格都有“UserId”列。我可能想确保我总是为登录用户选择行。我可以轻松创建一个ICriterion对象,但我不得不为不同的方法提供它:FindAll(),FindFirst(),FindLast()等。
有没有办法强制对Castle ActiveRecord的所有查询使用WHERE子句?
答案 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)