Как Вы отображаете перечисление как международное значение с быстрым NHibernate?

Операции takeWhile и dropWhile добавлены в JDK 9. Ваш примерный код

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);

будет вести себя точно так, как вы ожидаете, когда он скомпилирован и запущен под JDK 9.

Выпущен JDK 9. Его можно скачать здесь: http://jdk.java.net/9/

87
задан Garry Shutler 13 January 2009 в 16:15
поделиться

5 ответов

Способ Определите это соглашение, которое иногда менялось назад, теперь оно:

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

    public void Apply(IPropertyInstance target)
    {
        target.CustomType(target.Property.PropertyType);
    }
}
83
ответ дан 24 November 2019 в 07:45
поделиться

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

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

пользовательский тип вынуждает его быть обработанным как экземпляр перечисления вместо того, чтобы использовать GenericEnumMapper<TEnum>.

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

<час>

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

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

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);

Вы добавляете соглашение к своему Быстрому NHibernate, отображающемуся как так;

Fluently.Configure(nHibConfig)
    .Mappings(mappingConfiguration =>
    {
        mappingConfiguration.FluentMappings
            .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
    })
    ./* other configuration */
45
ответ дан Garry Shutler 5 November 2019 в 15:24
поделиться

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

0
ответ дан James Gregory 5 November 2019 в 15:24
поделиться

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

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> 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);
    }
}
40
ответ дан 24 November 2019 в 07:45
поделиться

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

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

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

25
ответ дан 24 November 2019 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: