фильтр свойств с быстрым автоматическим отображением - PullRequest
4 голосов
/ 20 апреля 2011

Я пытаюсь создать фильтр, используя автоматическое отображение nH (1.2) с помощью nH 2.1.2.
Я следовал примеру здесь , но получаю исключение:

filter-def for filter named 'DateFilter' was never used to filter classes nor collections..  

класс фильтра:

public class DateFilter : FilterDefinition
    {
        public DateFilter()
        {
            WithName(Consts.FilterConsts.DATE_FILTER)
                .AddParameter("date", NHibernate.NHibernateUtil.DateTime)
                .WithCondition("DATEPART(dayofyear,EntityTime) = DATEPART(dayofyear, :date)")
                ;
        }
    }

и в переопределении сопоставления:

mapping.HasMany(x => x.Stuff)
                .LazyLoad()
                .ReadOnly()
                .ApplyFilter<DateFilter>();

вот мой код конфигурации.

Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008
                .DefaultSchema("dbo")               //set default schema to enable full-qualified queries
                .AdoNetBatchSize(batchSize > 0 ? batchSize : 1)
                .UseReflectionOptimizer()
                .ConnectionString(c => c.FromConnectionStringWithKey(connectionStringKey))
                    .Cache(c => c.UseQueryCache()
                                    .ProviderClass(
                                    isWeb ? typeof(NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName //in web environment- use sysCache2
                                        : typeof(NHibernate.Cache.HashtableCacheProvider).AssemblyQualifiedName //in dev environmet- use stupid cache
                                    )) 
                          )
                 .Mappings(m => m.AutoMappings.Add(
                    AutoMap.AssemblyOf<Domain.Entity>(cfg)     //automapping the domain entities
                    .IncludeBase<Domain.SomethingBase>()               //ensure that although SomethingBase is a base class, map it as well. this enables us to store all Something sub-classes in the same table
                    .IncludeBase<Domain.OrOtherBase>()    //create a table for the abstract 'OrOtherBase' class
                    .UseOverridesFromAssemblyOf<MappingOverrides.MappingOverride>()
                    .Conventions.Add(DefaultCascade.All())      //make sure that all saves are cascaded (i.e when we save a zone, its queues are saved as well)
                    .Conventions.AddFromAssemblyOf<IdGenerationWithHiLoConvention>()
                    ))
                 .Mappings(m => m.FluentMappings.Add(typeof(DateFilter)));

если я переместу строку перед частью автоотображения, я получу исключение:

 NHibernate.MappingException: filter-def for filter named 'DateFilter' was not found.  

Кто-нибудь может сказать мне, что я делаю не так?

1 Ответ

3 голосов
/ 30 июня 2011

ОК, так что я понял это. Когда вы добавляете сопоставления отдельно, как это, они заканчиваются в разных сопоставлениях, и это будет либо жаловаться, что вы никогда не используете фильтр, либо жаловаться, что он не может найти фильтр, потому что он не просматривает оба места. Решение состоит в том, чтобы добавить его непосредственно к автомату, так что в вашем случае, как:

//other stuff up here
.Mappings(m => m.AutoMappings.Add(() => {
    var a = AutoMap.AssemblyOf<Domain.Entity>(cfg) 
                .IncludeBase<Domain.SomethingBase>() //and also cascades and conventions and stuff
    a.Add(typeof(DateFilter));
    return a;
 }));

Вроде брутто, потому что .Add() не говорит свободно, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...