Подтвердить что ты не робот

Карта 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 );
    }
}
4b9b3361

Ответ 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.