Нормализация 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 и сталкиваетесь с устаревшими базами данных.