. Обычно многие файлы в Visual Studio 2010 открываются во многих вкладках, в то же время массово работая над проектом. , Много раз я обнаруживал, что щелкаю правой кнопкой мыши по заголовку вкладки и ищу Показать / Выбрать / Прокрутить до этого файла в Обозревателе решений
, и не могу его найти.
Другие свойства перечисления в модели должны быть сопоставлены со строками, поэтому я не хочу определять ...
Я пытаюсь сопоставить свойство перечисления (экземпляр System.DayOfWeek) в моей модели с целочисленным полем базы данных , Другие свойства перечисления в модели должны быть сопоставлены со строками, поэтому я не хочу определять соглашение.
Я понимаю, что это должно быть возможно при использовании беглого отображения, подобного:
Map(x => x.DayOfWeek).CustomType();
, и действительно, на первый взгляд это выглядит чтобы работать.
Однако я заметил, что экземпляры сущностей со свойствами, отображаемыми таким образом, обновляются каждый раз, когда сеанс сбрасывается, даже если в них не было внесено никаких изменений.
Чтобы выяснить, что вызывает В этом случае я установил IPreUpdateEventListener и проверил OldState и State объекта. Смотрите прикрепленное изображение. В OldState соответствующим объектом является int, тогда как в State это DayOfWeek.
Если я использую отображение HBM XML без указанного атрибута типа, эта проблема не возникает.
Итак ...
Это ошибка или недостаток в GenericEnumMapper? Есть ли способ сообщить FNH-сопоставлению не указывать атрибуты типа в сгенерированном HBM? Если нет, могу ли я указать тип по умолчанию, который NH использует для перечислений (и что это)?
Если вы используете мое соглашение о перечислении, у вас нет этой проблемы.
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);
РЕДАКТИРОВАТЬ: Обновлено соглашение, чтобы выбрать конкретные перечисления для использования для преобразования int. Все перечисления, которые здесь не проверяются, будут отображаться как строки. Возможно, вам придется немного поэкспериментировать с тем, против чего на самом деле тестировать. Я не уверен, что свойство propertytype сделает это напрямую.
Один из способов обхода, который я использую, - это иметь поле поддержки int и позволить NHibernate использовать его для сопоставления.
Всякий раз, когда NHibernate должен выполнить приведение для сравнения нового значения со старым - оно всегда помечается как грязное, что вызывает сброс.
Это зависит от того, нужно ли вам указывать DayOfWeek как целое число.
Если вы выполняете приведение как часть сопоставления, равенство всегда не выполняется, и свойство будет помечено как грязное.
Я бы, вероятно, сопоставил:
Map (x => x.DayOfWeek) .CustomType ();
и создал свойство только для чтения, которое представляет значение DayOfWeek как целое число, если это действительно необходимо. В любом случае сопоставление фактического типа должно работать и предотвращать ложное загрязнение.
Вы можете рассмотреть альтернативный подход; Я обнаружил, что использование хорошо известных типов экземпляров Фабио Мауло неоценимо для таких целей. Польза от них становится очевидной каждый раз, когда вы пытаетесь расширить возможности базового перечисления (например, предоставить локализованное описание и т. Д.)