Пользовательские карты Fluent NHibernate не работают с AutoMapping

У меня проблема с Fluent NHibernate AutoPersistenceModelGenerator. Не хочет подхватывать пользовательские карты.

Использование Sharp Architecture 2.0, Fluent NHibernate 1.2 и NHibernate 3.1.

Моя текущая соответствующая конфигурация выглядит следующим образом:

    public AutoPersistenceModel Generate()
    {
        // This mappings group works with the exception of custom maps!!
        var mappings = AutoMap.AssemblyOf<SecurableEntity>(new AutomappingConfiguration());
        mappings.Conventions.Setup(GetConventions());
        mappings.IgnoreBase<Entity>();
        mappings.IgnoreBase<SecurableEntity>();
        mappings.IgnoreBase(typeof(EntityWithTypedId<>));
        mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();

        //mappings.UseOverridesFromAssemblyOf<UserMap>(); // Should call Override method of UserMap, but doesn't appear to...
        mappings.Override<User>(new UserMap().Override()); // This hack fixes the issue with calling the Override method of UserMap.
        mappings.UseOverridesFromAssemblyOf<UserMap>();

        return mappings;
    }

class UserMap : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        //mapping => mapping.Table("Users");
        mapping.Table("Users");
    }

    public Action<AutoMapping<User>> Override()
    {
        return map =>
            {
                map.Table("Users");
            };
    }
}

Я пытался вносить различные изменения в конфигурацию и публиковать интернет-статьи о Fluent NHibernate, но безрезультатно. У меня есть рабочая версия, использующая Sharp Arch 1.x и более ранние версии NHibernate и Fluent. Я предполагаю, что произошло изменение в синтаксисе, которое мне не хватает. Любая помощь будет принята с благодарностью.

Спасибо! Джон




Ответы (1)


Свободно использующий NHibernate использует Assembly.GetExportedTypes() метод, чтобы получить все переопределяет из данной сборки. Как сказано в документации этого метода, он получает общедоступные типы, определенные в этой сборке, которые видимы вне сборки. Ваше переопределение неявно является внутренним. Просто добавьте public перед class UserMap и все заработает.

person NOtherDev    schedule 20.10.2011
comment
Вау, я извиняюсь за это. Трудно поверить, что я так долго работал над этим, не заметив отсутствующего модификатора общего доступа... - person user1003221; 21.10.2011
comment
Если вы найдете ответ полезным, проголосуйте за него. Если это решит вашу проблему, отметьте это как ответ. Спасибо! - person NOtherDev; 21.10.2011
comment
Очень полезный ответ. Conventions.AddFromAssemblyOf нормально обрабатывает внутренние типы, поэтому я никогда не думал, что UseOverridesFromAssemblyOf не может этого сделать. Это довольно непоследовательно. - person Sergei Tachenov; 16.07.2016