Использование перечисляемых типов с плавным NHibernate и автоматическим отображением

#fluent-nhibernate #enums #guid

#fluent-nhibernate #перечисления #guid

Вопрос:

Я изучаю проект с использованием nhibernate, и у меня есть вопрос о том, как наилучшим образом реализовать следующий сценарий, используя FluentNHibernate 1.0.0.593 и NHibernate 2.1.0.4000

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

 DeviationLog:  
  Id uniqueidentifier  
  DeviationType uniqueidentifier  
  IncomingMessageId uniqueidentifier  

DeviationType:  
  Id uniqueidentifier  
  DeviationTypeCategory uniqueidentifier  
  DeviationMessage nvarchar(255)  

DeviationTypeCategory:  
  Id uniqueidentifier  
  DeviationTypeCategoryName nvarchar(255)  
  

В настоящее время я использую автоматическое отображение с соглашениями.

Когда я создаю экземпляр Deviation, я хотел бы иметь возможность делать что-то вроде следующего:

 var deviation = new Deviation{DeviationType=DeviationEnum.NoMatchMobileNumber}; 
  

Теперь, насколько я знаю, перечисления поддерживают только целые типы, так что это не сработает без альтернативного подхода. Я думал о том, чтобы, возможно, использовать словарь для этого, например Dictionary<DeviationEnum,Guid> , и я также подозреваю, что мне может понадобиться использовать UserTypeConvention<T> , чтобы как-то заставить это работать.

У кого-нибудь есть опыт, которым можно поделиться?

Ответ №1:

Что я традиционно делал, так это использовал пользовательский класс IUserType, который переводил бы между рассматриваемым перечислением и тем, как оно будет сохраняться. Однако для этого требовался пользовательский IUserType для каждого типа перечисления.

Комментарии:

1. Не могли бы вы вставить пример или указать на некоторые другие ресурсы, которые могли бы быть полезны?

2. Я бы посмотрел на исходный код NHibernate для YesNoType, который имеет аналогичную функцию, чтобы превратить bool в «Yes» или «No» в строковом поле, чтобы сохранить его. Учитывая количество различных перечислений, которые у меня были, я в конечном итоге создал абстрактный класс, так что у каждого перечисления был просто подкласс, в котором были сопоставления.