Карта Enum as Int с свободным NHibernate и NHibernate 3
Я использовал этот Как вы сопоставляете enum как значение int с белым NHibernate? для сопоставления в прошлом, но недавно я обновился до NHibernate 3, и это похоже, больше не работает. Я поставил контрольные точки в классе EnumConvention, и они не попадают. Запрос, который попадает в базу данных, содержит перечисление как строку, которая является конфигурацией по умолчанию.
Как это работает с NHibernate 3?
Обновление
Вот часть файла сопоставления, который сгенерирован:
<property name="ComponentType" type="FluentNHibernate.Mapping.GenericEnumMapper`1[[...ComponentType, ..., Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], FluentNHibernate, Version=1.1.0.0, Culture=neutral, PublicKeyToken=8aa435e3cb308880">
<column name="ComponentTypeId" />
</property>
Не похоже, что он использовал бы GenericEnumMapper
, если для перечислений указан IUserTypeConvention
.
Вот моя конвенция:
public class EnumConvention : IUserTypeConvention
{
public void Accept( IAcceptanceCriteria<IPropertyInspector> criteria )
{
criteria.Expect( e => e.Property.PropertyType.IsEnum );
}
public void Apply( IPropertyInstance instance )
{
instance.CustomType( instance.Property.PropertyType );
}
}
Ответы
Ответ 1
Просто выполнение Map( m => m.MyEnum ).CustomType<MyEnum>()
, похоже, теперь отлично работает.
Если кто-нибудь знает, почему IUserTypeConvention
не работает с Fluent NHibernate в NHibernate 3, мне все равно хотелось бы знать, почему. Может быть, потому, что отображение пользовательского типа в enum работает сейчас, но почему он не был удален из lib тогда?
Ответ 2
Я столкнулся с аналогичной проблемой с Nhibernate 3.0GA и FluentNh (перестроим с последней версией NH). UserTypeConventions не регистрируются должным образом.
проблема, описанная здесь:
http://groups.google.com/group/nhusers/browse_thread/thread/c48da661f78bfad0
Ответ 3
Вы должны наследовать свое соглашение не из IUserTypeConvention, а из FluentNHibernate.Conventions.UserTypeConvention.
Например, это точное соглашение, которое я использую для сопоставления логических и нулевых логических значений с пользовательским типом UserTrueFalseType:
/// <summary>
/// Convention: Boolean fields map to CHAR(1) T/F/Null
/// </summary>
public class BooleanTrueFalseConvention : FluentNHibernate.Conventions.UserTypeConvention<UserTrueFalseType>
{
/// <summary>
/// Accept field type criteria
/// </summary>
/// <param name="criteria"></param>
public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria)
{
criteria.Expect(instance =>
instance.Property.PropertyType.Equals(typeof(System.Boolean))
||
instance.Property.PropertyType.Equals(typeof(System.Nullable<System.Boolean>))
);
}
}
Это работает с NH 3.3 и последней версией Fluent.