Карта Enum как Int с беглыми NHibernate и NHibernate 3 - PullRequest
23 голосов
/ 21 марта 2011

Я использовал это Как вы отображаете 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 );
    }
}

Ответы [ 3 ]

43 голосов
/ 23 марта 2011

Простое выполнение Map( m => m.MyEnum ).CustomType<MyEnum>(), кажется, теперь работает нормально.

Если кто-нибудь знает, почему IUserTypeConvention не работает с Fluent NHibernate в NHibernate 3, я все равно хотел бы знать, почему. Возможно, это связано с тем, что теперь сопоставление пользовательского типа с перечислением работает, но почему тогда его не удалили из библиотеки?

1 голос
/ 24 марта 2011

У меня похожая проблема с Nhibernate 3.0GA и FluentNh (пересобрать с последней версией NH). UserTypeConventions не регистрируются должным образом.

проблема описана здесь: http://groups.google.com/group/nhusers/browse_thread/thread/c48da661f78bfad0

0 голосов
/ 11 декабря 2012

Вы должны унаследовать ваше соглашение не от 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.

...