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

Перечисление в целочисленное сопоставление, вызывающее обновления на каждом потоке

Я пытаюсь сопоставить свойство enum (экземпляр System.DayOfWeek) в моей модели с полем целочисленной базы данных. Другие свойства перечисления в модели должны быть сопоставлены с строками, поэтому я не хочу определять соглашение.

Я понимаю, что это должно быть возможно с использованием свободного отображения, например:

Map(x => x.DayOfWeek).CustomType<int>();

и действительно, на первый взгляд это работает.

Тем не менее, я заметил, что экземпляры объектов со свойствами, сопоставленными таким образом, обновляются каждый раз, когда сеанс очищается, хотя никаких изменений к ним не было.

Чтобы узнать, что вызывает этот флеш, я настроил IPreUpdateEventListener и проверил OldState и State объекта. См. Прикрепленное изображение. В OldState соответствующий объект является int, тогда как в State это DayOfWeek.

Если я использую XML-сопоставление HBM без указанного атрибута типа, эта проблема не возникает.

Итак...

Является ли это ошибкой или недостатком в GenericEnumMapper? Есть ли способ показать отображение FNH, чтобы не указывать какой-либо атрибут типа на сгенерированном HBM? Если нет, могу ли я указать тип по умолчанию, который NH использует для перечислений (и что это такое)?

alt text

4b9b3361

Ответ 1

Если вы используете мое соглашение enum, у вас нет этой проблемы.

public class EnumConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType(instance.Property.PropertyType);
    }

    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType == typeof(AddressType)  ||
            x.Property.PropertyType == typeof(Status) ||
            x.Property.PropertyType == typeof(DayOfWeek));
    }
}

Затем вы можете сопоставить свою собственность, как обычно:

Map(x => x.DayOfWeek);

EDIT: Обновлено соглашение, чтобы выбрать конкретные перечисления для использования для преобразования int. Все перечисления, которые не проверяются здесь, будут отображаться как строка. Возможно, вам придется немного поэкспериментировать с тем, что на самом деле нужно протестировать. Я не уверен, что свойство property будет делать это напрямую.

Ответ 2

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

Map(x => x.DayOfWeek).CustomType<enumType>();

Он помогло: он переставал обновляться каждый раз.

Источник: https://groups.google.com/forum/#!searchin/fluent-nhibernate/enum/fluent-nhibernate/bBXlDRvphDw/AFnYs9ei7O0J

Ответ 3

Один способ обхода, который я использую, состоит в том, чтобы иметь поле int backing и позволить NHibernate использовать его для сопоставления.

Всякий раз, когда NHibernate должен делать бросок, чтобы сравнить новое значение со старым - он всегда помечен как грязный - вызывает флеш.

Ответ 4

Простым способом, который работал у меня, было изменение настраиваемого типа отображения от int до PersistentEnumType. Обязательно объявите общую версию, чтобы сделать вашу жизнь проще:

public class PersistentEnumType<T> : PersistentEnumType {
    public PersistentEnumType() : base(typeof(T)) {}
}

Затем используйте

Map(x => x.DayOfWeek)
    .CustomType<PersistentEnumType<System.DayOfWeek>>();

Это не требует изменений в ваших сущностях, только сопоставлениях и может применяться для каждого свойства.

Подробнее здесь.

Ответ 5

Это зависит от того, нужен ли DayOfWeek как целое число.

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

Я бы предположил, что карта:

Карта (x = > x.DayOfWeek).CustomType();

и создать свойство только для чтения, которое представляет значение DayOfWeek как целое число, если оно действительно требуется. Независимо от того, что отображение в качестве фактического типа должно работать и предотвращать ложные ошибки.

Ответ 6

Вы можете рассмотреть альтернативный подход; Я нашел использование Fabio Maulo известных типов экземпляров, чтобы быть неоценимым для таких целей. Преимущество этих действий сразу же проявляется в любое время, когда вы пытаетесь расширить то, что может сделать базовое перечисление (например, предоставление локализованного описания и т.д.).