Перечисление в целочисленное сопоставление, вызывающее обновления на каждом потоке
Я пытаюсь сопоставить свойство enum (экземпляр System.DayOfWeek) в моей модели с полем целочисленной базы данных.
Другие свойства перечисления в модели должны быть сопоставлены с строками, поэтому я не хочу определять соглашение.
Я понимаю, что это должно быть возможно с использованием свободного отображения, например:
Map(x => x.DayOfWeek).CustomType<int>();
и действительно, на первый взгляд это работает.
Тем не менее, я заметил, что экземпляры объектов со свойствами, сопоставленными таким образом, обновляются каждый раз, когда сеанс очищается, хотя никаких изменений к ним не было.
Чтобы узнать, что вызывает этот флеш, я настроил IPreUpdateEventListener и проверил OldState и State объекта.
См. Прикрепленное изображение. В OldState соответствующий объект является int, тогда как в State это DayOfWeek.
Если я использую XML-сопоставление HBM без указанного атрибута типа, эта проблема не возникает.
Итак...
Является ли это ошибкой или недостатком в GenericEnumMapper?
Есть ли способ показать отображение FNH, чтобы не указывать какой-либо атрибут типа на сгенерированном HBM?
Если нет, могу ли я указать тип по умолчанию, который NH использует для перечислений (и что это такое)?
![alt text]()
Ответы
Ответ 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 известных типов экземпляров, чтобы быть неоценимым для таких целей. Преимущество этих действий сразу же проявляется в любое время, когда вы пытаетесь расширить то, что может сделать базовое перечисление (например, предоставление локализованного описания и т.д.).