Обновлен до NHibernate 3.2 / FNH 1.3 - теперь поколение Id изменилось - PullRequest
0 голосов
/ 04 января 2012

Пытался перейти с NH 2.1.2 / FNH 1.0 на 3.2 / 1.3 и обнаружил много проблем.

Последнее, что поведение генерации идентификатора изменилось для моего приложения.

Я никогда не устанавливал схему генерации идентификаторов в явном виде - стандартное поведение автоинкрементного целочисленного идентификатора работало в моих целях, поэтому я никогда не менял его. (База данных SQLite).

Но с новыми DLL идентификаторы генерируются не одинаково.

Например, с моей тестовой базой данных и старыми DLL самое высокое значение ID было 109. Но с новыми DLL самое большое число теперь 55. У меня есть некоторая логика, которая зависит от самого высокого ID, поэтому сломал приложение.

Была ли изменена схема генерации идентификатора по умолчанию, NH или FNH?

Любые другие предложения относительно того, почему поведение могло измениться с новыми версиями?

Редактировать

Вот критический код (я думаю). «OfeEntity» (в конце листинга) является базовым классом, который определяет свойство «Id».

private static void CreateNewSqliteDbAndSessionFactory()
{
    _sessionFactory = Fluently.Configure()
        .Database(SQLiteConfiguration.Standard
                      .UsingFile(SqliteDatabaseFullPath())
                 )
        .Mappings(m => m.AutoMappings.Add(GetAutoPersistanceModel)
                                     // Save XML mapping files to this dir
                                     //.ExportTo(autoMapExportDir)
                 )
        .ExposeConfiguration(BuildSchema)
        .BuildSessionFactory();
}

private static AutoPersistenceModel GetAutoPersistanceModel()
{
    return AutoMap.Assemblies(_assemblies)
        .IgnoreBase<OfeEntity>()
        .Where(t => t.IsSubclassOf(typeof(OfeEntity))  )

        // Required for NH 3.2, otherwise will get "no setter" errors for
        // properties that only have a "get" method
        .OverrideAll(x => x.IgnoreProperties(property => !property.CanWrite))

        .Conventions.Add(
            DefaultCascade.All(),
            DefaultLazy.Always()
        );

}

public abstract class OfeEntity
{
    [Browsable(false)] // Hide from databound controls 
    public virtual int Id { get;  protected set; }
    //...
}
...