Свободная конфигурация автомата NHibernate выдает неопределенную ошибку

Я пробую возможность автоматического сопоставления в Fluent NHibernate, и тот же код, который работал с явными ClassMap конфигурациями, не работает при создании SessionFactory, когда я пытаюсь переместить его на автоматическое сопоставление.

Вот код:

public static ISessionFactory GetSessionFactory()
{
    if (_sessionFactory == null)
    {
        _sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DB")))
            // It works with the following:
            // .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Customer>())
            // It fails with this:
            .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>()))
            .BuildSessionFactory();

    return _sessionFactory;
}

Я получаю следующую ошибку:

При создании SessionFactory использовалась недопустимая или неполная конфигурация. Проверьте коллекцию PotentialReasons и InnerException для получения дополнительных сведений.

Я получаю Count = 0 для PotentialReasons, и внутреннее исключение такое же, как указано выше.

Трассировка стека относится к:

в FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory () в d: \ Builds \ FluentNH-v1.x-nh3 \ src \ FluentNHibernate \ Cfg \ FluentConfiguration.cs: строка 113

Похоже, я перепробовал все, чтобы заставить его работать, и ближе всего к тому, что я подошел, была инициализация только для того, чтобы получить Could not find persister for... ошибку, когда я пытался использовать сеанс, и я даже не помню, как я смог чтобы это произошло.

Я использую сборку № 694 с NHibernate 3.0, база данных SQL 2008. Есть идеи, что я делаю не так?


person Josh Anderson    schedule 28.03.2011    source источник
comment
Обычно существует 3-4 уровня вложенных внутренних исключений. Вы их все осмотрели?   -  person Aliostad    schedule 28.03.2011
comment
Вау ... Я чувствую себя идиотом! Вы абсолютно правы - когда я углубился, я увидел, что это перечисления сопоставления проблем. В своих явных сопоставлениях я просто сделал CustomType(typeof(MyEnum)), но мне нужно посмотреть, как это возможно при автоматическом сопоставлении ...   -  person Josh Anderson    schedule 28.03.2011


Ответы (1)


Это была глупая ошибка, которую мне помог найти комментарий Алиостада. У меня был тип перечисления, который хранился в базе данных как целое число, и NHibernate задыхался от этого. Я добавил в настройку EnumConvention следующим образом:

_sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DB")))
    .Mappings(
        m =>
        m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>(new AutomapConfiguration()).Conventions.
                               Setup(c =>
                                         {
                                             c.Add<PrimaryKeyConvention>();
                                             c.Add<EnumConvention>();
                                             c.Add<CascadeAllConvention>();
                                         })
                               .IgnoreBase(typeof (EntityBase<>))
                               .OverrideAll(map => map.IgnoreProperty("IsValid"))))
    .BuildSessionFactory();

Вот это соглашение enum:

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}
person Josh Anderson    schedule 28.03.2011