Как сохранять enum в БД? - CodeHelper

Как сохранять enum в БД?

2

Собственно, такая задача. У объекта есть свойство, имеющее тип перечисления. Каким образом сохранять значение этого свойства в БД?

Навскидку видится 3 варианта разрешения проблемы:

  1. Сохранять в базе строковое значение элемента enum'а. В этом случае могут возникнуть проблемы, если в будущем элемент будет переименован. В базе останутся старые строковые представления.
  2. Сохранять целочисленное значение элемента enum'а. В этом случае проблемы возникают если в enum добавляется новый элемент, но ему присваивается значение одного из существующих (т.е. новый добавляется между двумя существующими).
  3. Отказаться от использования enum'а. Вместо него использовать объект с единственным свойством типа string. В отдельной таблице в базе хранить возможные значения и ссылаться на них из других таблиц. Наверное, такой способ наиболее удачен с точки зрения сохраняемости, но взамен теряются все преимущества использования перечислений в коде.

Как видно, у каждого из способов существуют свои недостатки. Может быть существуют более удачные решения?

Новые ответы

Новые Лучшие

0

nickle centre pharmacy http://sundrugstore.net/products/cystone.htm kamagra online pharmacy

0

Еще выдержка из МСДН:

Во время компиляции все ссылки на отдельные значения перечисления преобразуются в числовые литералы. Назначение дополнительных значений новым версиям перечислений или изменение значений членов перечислений в новой версии может вызвать проблемы для зависимого исходного кода. Часто бывает так, что значения enum используются в операторах switch и при добавлении элементов к типу enum тест для значений по умолчанию может неожиданно вернуть значение "true".

А по сему, лучше все-таки задавать явные значения.

1

В enum можно явно задать значения для каждого элемента:

enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };

Таким образом, уходит проблема с добавлением новых элементов.

safonovea

Допустим есть такое перечисление:

enum Levels
{
    Lowest = 1,
    Medium = 2,
    Highest = 3
}

Вдруг появилась необходимость добавить еще два уровня — Lower и Higher. Будет нелогично добавлять их со значениями 4 и 5. Логичнее будет сделать так:

enum Levels
{
    Lowest = 1,
    Lower = 2,
    Medium = 3,
    Higher = 4,
    Highest = 5
}
alex.algel

Представим что у нас в БД есть справочник:

ID Descr
1  Lowest
2  Medium
3  Highest

А потом мы решим добавить еще два элемента и поменять ID у существующих... к чему это приведет понятно? Получается, что хранение упорядоченного списка значений в виде enum - не самое лучшее решение...

alex.algel

Еще, как вариант, реализовать enum следующим образом:

enum Levels
{
    Lowest = 10,
    Medium = 20,
    Highest = 30
}
safonovea

Согласен, тоже путаница получается. А что если так:

id description order
1  Lowest      1
2  Medium      2
3  Highest     3

Добавили еще 2 элемента и изменили порядок:

id description order
1  Lowest      1
2  Medium      3
3  Highest     5
4  Lower       2
5  Higher      4
alex.algel

Для справочника в БД это как раз нормальное решение, а вот реализовать такое с помощью enum будет достаточно проблематично... Разве что с помощью атрибутов.

safonovea

Да-да, этот вариант (как я уже указал в вопросе) предполагает отказ от использования enum'а.


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.