Как избежать зависимостей между значениями Enum в коде и соответствующими значениями в базе данных?
У меня есть несколько пользовательских разрешений, которые протестированы в моем приложении ASP.NET. Эти значения разрешений указываются в Enum, чтобы я мог удобно протестировать разрешения следующим образом:
- btnCreate.Enabled = PermissionManager.TestPermission(Permission.AllowCreate);
Однако у меня также есть эти разрешения, хранящиеся в базе данных, потому что мне нужно больше узнать о них, чем просто их идентификатор. Но это создает ужасную зависимость между значениями перечисления и значениями в базе данных, плохое изменение для обоих, и у меня проблемы во всем приложении. Есть ли лучший способ решить эту проблему? Кто-нибудь имел дело с этим раньше?
Ответы
Ответ 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 и т.д.), Поэтому генератор кода знает, какой столбец следует использовать в качестве имени для элементов перечисления.
После того, как значения добавлены в эти таблицы, мы позаботимся о том, чтобы они никогда не меняли их, чтобы не нарушать сборку.