Почему Fluent NHibernate 1.3 игнорирует мои соглашения? - PullRequest
0 голосов
/ 07 марта 2012

Я пытался перейти с NHibernate 2.3 на 3.2 , включая переход с Fluent NHibernate 1.0 на 1.3 .

После выполнения обновления соглашения Fluent, обнаруженные при поиске сборок, по-видимому, не применяются; Я получаю множество ошибок с жалобами на невозможность найти определенные свойства или столбцы.

Изменить:

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

.Mappings(
    m => m.FluentMappings
        .AddFromAssemblyOf<NHibernateMapping>()
        .Conventions.AddFromAssemblyOf<NHibernateMapping>())

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

Ошибка проявляется через NHibernate следующим образом:

NHibernate.MappingException: не удалось найти установщик для свойства 'All' в классе 'Headline'

Свойство All не имеет установщика - одно из соглашений должно изменить отображение для ссылки на установщик для другого свойства.

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

Почему мои условные обозначения не применяются к отображению?

Edit:

Методом проб и ошибок я обнаружил, что проблема заключается в вызове AddFromAssemblyOf<T>(). Система сопоставления находит и инициализирует каждый из типов IConvention, но затем не добавляет их к посетителю и не применяет их к сопоставлению.

Обходной путь - добавить каждое соглашение вручную с помощью вызова Add<TConvention>(). Это работает для нас, потому что у нас есть несколько соглашений. Не нужно много усилий, чтобы написать метод расширения для замены AddFromAssemblyOf<T>(), если кому-то понадобится более надежное решение проблемы.

Все еще не уверены, почему это не работает, но теперь это похоже на ошибку.

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Мы используем 1.3 и используем метод расширения, чтобы добавить все наши соглашения следующим образом:

 var config = Fluently.Configure()
                .Database(sqlConfig)
                .Mappings(GetMappings)
                .Diagnostics(x => x.Enable(Settings.EnableLogging))
                .Search(ConfigureSearch)
                .ExposeConfiguration(ExposeConfiguration);

protected void GetMappings(MappingConfiguration mappingConfiguration)
        {
            foreach (var assemblyName in AssemblyHelper.GetModelAssemblies())
            {
                var assembly = Assembly.Load(assemblyName);


     var assembly = Assembly.Load(assemblyName);

                    mappingConfiguration
                        .FluentMappings
                        .AddCustomConventions()
                        .AddFromAssembly(assembly);
}
}

public static AutoPersistenceModel AddCustomConventions(this AutoPersistenceModel autoPersistenceModel)
         {
             return
                     autoPersistenceModel
                     .Conventions.Add(typeof (StringLengthTypeConverter))
                     .Conventions.Add(typeof (GeneratedConvention))
                     .Conventions.Add(typeof (IndexPropertyConvention))
                     .Conventions.Add(typeof (LazyLoadPropertyConvention))
                     .Conventions.Add(typeof (LazyLoadClassConvention))
                     .Conventions.Add(typeof (FetchTypePropertyConvention))
                     .Conventions.Add(typeof (LazyLoadCollectionConvention))
                     .Conventions.Add(typeof (JsonStorageConvention))
                     .Conventions.Add(typeof (ManyToManyConvention))
                     .Conventions.Add(typeof (CustomForeignKeyConvention))
                     .Conventions.Add(typeof (CustomManyToManyTableNameConvention))
                     .Conventions.Add(typeof (HasManyConvention))
                     .Conventions.Add(typeof (IdConvention))
                     .Conventions.Add(typeof (PropertyConvention))
                     .Conventions.Add(typeof (ReferenceConvention))
                     .Conventions.Add(typeof (TableConvention))
                     .Conventions.Add(typeof (JoinedSubclassConvention));
         }
0 голосов
/ 07 марта 2012

Я успешно использую следующее (NH 3.2, FNH 1.3.0.717):

sessionFactory = Fluently.Configure(normalConfig)
                  .Mappings(m =>
                      m.FluentMappings
                      .AddFromAssemblyOf<OrderMap>()
                      .Conventions.AddFromAssemblyOf<PascalCaseColumnNameConvention>())
                      .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate") 
                  .BuildSessionFactory();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...