Нормализация EnumStringType в NHibernate - PullRequest
3 голосов
/ 03 декабря 2008

В настоящее время я использую перечисление в 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 Ответ

5 голосов
/ 23 декабря 2008

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

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

...