Подтвердить что ты не робот

Как избежать зависимостей между значениями Enum в коде и соответствующими значениями в базе данных?

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Или, возможно, сохраните перечисления как строку в БД. ToString();

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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