Нормализация EnumStringType в NHibernate

В настоящее время я использую перечисление в NHibernate, сопоставленный следующим образом.

public enum UploadMethod
{
    Java, Silverlight, Gears, Flash
}

class UploadMethodType : EnumStringType
{
    public UploadMethodType() : base(typeof(UploadMethod), 255) { }
}

public class Person
{
    /* Bunch of non interesting properties... */
    public UploadMethod PreferredUploadMethod { get; set; }
}

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
 <class name="Person" lazy="false" table="[dbo].[People]">
  <!-- Bunch of non interesting properties... -->
  <property name="PreferredUploadMethod" type="UploadMethodType" />
 </class>
</hibernate-mapping>

Это прекрасно работает, за исключением того, что база данных далека от нормализации, в каждой строке таблицы People есть столбец, содержащий одну из четырех текстовых строк. Теперь я разделил это на новую таблицу, но я не уверен, как создать отображение в NHibernate. Мой первый инстинкт был просто <many-to-one> но я не хочу, чтобы это перечисление было собственной сущностью, мне просто нужно, чтобы NHibernate сделал простое соединение, чтобы добавить дополнительный столбец.

В качестве пробела я просто создал представление, которое работает нормально, но я бы предпочел, чтобы уровень абстракции был в моем отображении NHibernate, а не в схеме.

1 ответ

Решение

Если я вас правильно понял, ваша база данных нормализована отлично. Вы сказали NHibernate хранить Enum как строку, и это хорошо. Перечисление не является сущностью. Его определение не должно храниться в базе данных, потому что оно определено в C#.

Если вы удалите EnumStringType и отобразите перечисление как Int32, вы получите его как число. Это может выглядеть более "нормализованным" для вас, но это потенциальная проблема, когда вы изменяете свой enum и сталкиваетесь с устаревшими базами данных.

Другие вопросы по тегам