Как избежать зависимостей между значениями Enum в коде и соответствующими значениями в базе данных? - PullRequest
12 голосов
/ 15 ноября 2008

У меня есть несколько пользовательских разрешений, которые проверены в моем приложении ASP.NET. На эти значения разрешений ссылаются в Enum, чтобы я мог удобно проверить разрешения следующим образом:

  • btnCreate.Enabled = PermissionManager.TestPermission (Permission.AllowCreate);

Однако у меня также есть эти разрешения, хранящиеся в базе данных, потому что мне нужно хранить больше информации о них, чем просто их Id. Но это создает ужасную зависимость между значениями перечисления и значениями в базе данных, непродуманным изменением любого из них, и у меня возникают проблемы во всем приложении. Есть ли лучший способ обойти эту проблему? Кто-нибудь имел дело с этим раньше?

Ответы [ 6 ]

1 голос
/ 15 ноября 2008

Использование значений перечисления допустимо, если вы никогда не измените уже присвоенные значения. Если бы вы использовали стандартную авторизацию на основе ролей в .NET, вы бы все равно полагались на существование определенных текстовых строк в соответствующей таблице ролей в базе данных.

1 голос
/ 15 ноября 2008

Или, может быть, сохранить значения в виде строки в БД. ToString (); * * тысяча один

1 голос
/ 15 ноября 2008

Я не знаю, какое лучшее решение, я бы хотел это услышать. Наше решение состоит в том, чтобы явно набрать перечисление как

public enum MyEnum : int 
{
   None =0,
   Value = 1,
   AnotherValue =2 
}

И сохранить целочисленное значение в базе данных. Когда, например, значение 1 удалено, вы все равно сможете использовать перечисление, а AnotherValue по-прежнему будет иметь значение 2 в базе данных.

0 голосов
/ 11 декабря 2008

Я добавляю расширенное свойство к любой таблице, к которой мне нужно будет получить доступ в коде как перечисление. Затем я использую программное обеспечение для генерации кода (codesmith, T4 и т. Д.), Чтобы сгенерировать все мои перечисления для меня путем поиска любой таблицы с этим свойством. Любая таблица, которая должна использоваться для этого, подчиняется некоторым основным правилам (должна иметь столбец Name и т. Д.), Поэтому генератор кода знает, какой столбец использовать в качестве имени для элементов enum.

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

0 голосов
/ 21 ноября 2008

Некоторое время назад я создал небольшой инструмент для этой компании, который использовал бы атрибуты в полях перечисления, чтобы разрешить «синхронизацию» с таблицей в базе данных.

Инструмент может сканировать сборку и генерировать соответствующие команды SQL INSERT / UPDATE, которые синхронизируют базу данных с определением перечисления в коде.

0 голосов
/ 15 ноября 2008

Мы используем небольшое приложение, которое генерирует перечислимый код (пример: NorthwindEnums.cs) из базы данных. Мы обязательно запустим его и обновим затронутые библиотеки при каждом изменении базы данных.

Мы также стараемся, чтобы наши перечисления начинались с 0 и последовательно, чтобы избежать проблем со ссылками на веб-службы в C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...