Как вы сопоставляете enum как значение int с белым NHibernate?

Вопрос говорит, что все по-настоящему, по умолчанию это отображение в виде string но мне нужно, чтобы она отображалась как int .

В настоящее время я использую PersistenceModel для установки моих соглашений, если это имеет значение. Заранее спасибо.

Обновление. Найдено, что переход на последнюю версию кода из багажника разрешил мои проблемы.

Способ определения этого соглашения иногда менялся, это сейчас:

 public class EnumConvention : IUserTypeConvention { public void Accept(IAcceptanceCriteria criteria) { criteria.Expect(x => x.Property.PropertyType.IsEnum); } public void Apply(IPropertyInstance target) { target.CustomType(target.Property.PropertyType); } } 

Итак, как уже упоминалось, получение последней версии Fluent NHibernate с багажника привело меня туда, где я должен был быть. Пример отображения для enums с последним кодом:

 Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus)); 

Пользовательский тип заставляет его обрабатывать как экземпляр enums, а не использовать GenericEnumMapper .

Я на самом деле рассматриваю возможность отправки патча, чтобы иметь возможность изменять между enum mapper, который сохраняется в строке, и тот, который сохраняется в int, поскольку это похоже на то, что вы можете установить как соглашение.


Это появилось в моей недавней деятельности, и все изменилось в новых версиях Fluent NHibernate, чтобы сделать это проще.

Чтобы все enums отображались как целые числа, теперь вы можете создать такое соглашение:

 public class EnumConvention : IUserTypeConvention { public bool Accept(IProperty target) { return target.PropertyType.IsEnum; } public void Apply(IProperty target) { target.CustomTypeIs(target.PropertyType); } public bool Accept(Type type) { return type.IsEnum; } } 

Тогда ваше отображение должно быть:

 Map(quote => quote.Status); 

Вы добавляете соглашение к вашему Fluent NHibernate, например, так;

 Fluently.Configure(nHibConfig) .Mappings(mappingConfiguration => { mappingConfiguration.FluentMappings .ConventionDiscovery.AddFromAssemblyOf(); }) ./* other configuration */ 

Не забывайте об нулевых enumsх (например, ExampleEnum? ExampleProperty )! Их нужно проверять отдельно. Так происходит с новой конфигурацией стиля FNH:

 public class EnumConvention : IUserTypeConvention { public void Accept(IAcceptanceCriteria criteria) { criteria.Expect(x => x.Property.PropertyType.IsEnum || (x.Property.PropertyType.IsGenericType && x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) && x.Property.PropertyType.GetGenericArguments()[0].IsEnum) ); } public void Apply(IPropertyInstance target) { target.CustomType(target.Property.PropertyType); } } 

вот как я сопоставил свойство enum со значением int:

 Map(x => x.Status).CustomType(typeof(Int32)); 

работает на меня!

Для тех, кто использует Fluent NHibernate с Automapping (и потенциально контейнер IoC):

IUserTypeConvention является IUserTypeConvention @ Julien выше: https://stackoverflow.com/a/1706462/878612

 public class EnumConvention : IUserTypeConvention { public void Accept(IAcceptanceCriteria criteria) { criteria.Expect(x => x.Property.PropertyType.IsEnum); } public void Apply(IPropertyInstance target) { target.CustomType(target.Property.PropertyType); } } 

Конфигурация Fluent NHibernate Automapping может быть сконфигурирована следующим образом:

  protected virtual ISessionFactory CreateSessionFactory() { return Fluently.Configure() .Database(SetupDatabase) .Mappings(mappingConfiguration => { mappingConfiguration.AutoMappings .Add(CreateAutomappings); } ).BuildSessionFactory(); } protected virtual IPersistenceConfigurer SetupDatabase() { return MsSqlConfiguration.MsSql2008.UseOuterJoin() .ConnectionString(x => x.FromConnectionStringWithKey("AppDatabase")) // In Web.config .ShowSql(); } protected static AutoPersistenceModel CreateAutomappings() { return AutoMap.AssemblyOf( new EntityAutomapConfiguration()) .Conventions.Setup(c => { // Other IUserTypeConvention classes here c.Add(); }); } 

* Тогда CreateSessionFactory можно использовать в IoC, таком как Castle Windsor (с использованием PersistenceFacility и установщика). *

  Kernel.Register( Component.For() .UsingFactoryMethod(() => CreateSessionFactory()), Component.For() .UsingFactoryMethod(k => k.Resolve().OpenSession()) .LifestylePerWebRequest() ); 

Вы можете создать IUserType NHibernate и указать его с помощью CustomTypeIs() на карте свойств.

Вы должны хранить значения как int / tinyint в таблице DB. Для отображения вашего enums вам нужно правильно указать отображение. См. Ниже пример отображения и enums,

Класс сопоставления

 Открытый class TransactionMap: ClassMap Transaction
 {
     public TransactionMap ()
     {
         // Другие сопоставления
         .....
         // Отображение для enums
         Карта (x => x.Status, "Status"). CustomType ();

         Таблица ( "сделки");
     }
 }

Enum

 public enum TransactionStatus
 {
    Ожидание = 1,
    Обработано = 2,
    RolledBack = 3,
    Заблокировано = 4,
    Возврат = 5,
    AlreadyProcessed = 6,
 } 
  • Как вы можете делать пейджинг с NHibernate?
  • Подсоническое Vs NHibernate
  • Как TransactionScope откатывает транзакции?
  • Пакетное обновление в NHibernate
  • В чем разница между JoinQueryOver и JoinAlias?
  • Как обновить схемы таблиц базы данных с помощью генерации схемы NHibernate?
  • Критерии.DISTINCT_ROOT_ENTITY против Projections.distinct
  • Преобразование .NET Ticks в SQL Server DateTime
  • Запрос на ссылку HasMany
  • Лучший способ сохранить упорядоченный список в базе данных, сохраняя порядок
  • Как частично спроектировать дочерний объект со многими полями в nHibernate
  • Interesting Posts

    Firebase: как сгенерировать уникальный цифровой идентификатор для ключа?

    Как предотвратить изменение яркости экрана ноутбука при отключении / включении питания аккумулятора

    Могу ли я захватить управление Cmd-Left в OSX?

    Скользящий навигационный ящик не обрабатывает клики по пунктам меню android

    Qt Stylesheet для пользовательского виджета

    Построение интерполированных данных на карте

    Android Facebook SDK 3.0 дает «remote_app_id не соответствует сохраненному идентификатору» при входе в систему

    Изменение имени пространства в Mac OS X Lion

    Как разрезать ненужные видеоролики и присоединить остальные к одному видео с помощью FFmpeg?

    Замедление Microsoft Visual Studio из-за разного сканирования вирусов

    Ping server / domain и захватить его IP-адрес в Linux

    JavaFX: «Инструментарий» не инициализируется при попытке воспроизведения mp3-файла с помощью classа MediaPlayer

    Отключить автоматическую перезагрузку после Windows Update (в Windows Vista / 7)

    Как получить пользовательскую информацию пользователя от сервера авторизации сервера / пользователя OAuth2

    Преобразование строки Java в sql.Timestamp

    Давайте будем гением компьютера.