Свободная конфигурация автомата NHibernate, выдающая неопределенную ошибку - PullRequest
2 голосов
/ 28 марта 2011

Я испытываю возможность автоматического отображения в 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. Проверьте Потенциальные Причины Коллекция и 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. Есть идеи, что я делаю не так?

1 Ответ

2 голосов
/ 28 марта 2011

Это глупая ошибка, которую комментарий Алиостада помог мне найти.У меня был тип enum, который хранился как целое число в базе данных, и 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);
    }
}
...