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

#nhibernate #fluent-nhibernate #nhibernate-mapping #fluent-nhibernate-mapping #sharp-architecture

#nhibernate #fluent-nhibernate #nhibernate-отображение #fluent-nhibernate-отображение #sharp-архитектура

Вопрос:

У меня возникла проблема с 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:

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

Комментарии:

1. Вау, я прошу прощения за это. Трудно поверить, что я работал над этим так долго, не замечая отсутствующего модификатора общедоступного доступа…

2. Если вы найдете ответ полезным, поддержите его. Если это решит вашу проблему, отметьте ее как ответ. Спасибо!

3. Очень полезный ответ. Conventions.AddFromAssemblyOf хорошо обрабатывает внутренние типы, поэтому я бы никогда не подумал, что UseOverridesFromAssemblyOf это невозможно. Это довольно непоследовательно.