Этот ответ не дает конкретного решения вашей проблемы, но я надеюсь, что это может дать вам некоторый намек.
В этой проблеме есть несколько сообщений, например this one. Популярный способ сделать это состоит в том, чтобы иметь перечисления в вашем коде, а также таблицы в вашей базе данных для хранения расширенной информации перечисления (например, отображаемых имен и других данных) и для их синхронизации, применяя изменения в своих перечислениях к таблицам базы данных содержимое с использованием пользовательского кода (старайтесь не писать вручную SQL-скрипты вручную).
EF6 не обеспечивает готовое решение для этого. Существует несколько пакетов Nuget, которые реализуют этот пользовательский код синхронизации. Я не могу дать вам советы о них, поскольку я их не использовал.
Также вы должны рассмотреть свой конкретный сценарий: как часто изменяются ваши списки, размер ваших списков, нужно ли вам только красивое имя для отображения или какие-либо другие дополнительные данные, разрешите ли вы пользователям изменять списки или это будет сделано только разработчиками, нужно ли вам динамически изменять эти данные во время выполнения (без изменения/компиляции/публикации вашего кода), версии EF, которую вы используете, и т. д. Будущая версия EF может обеспечить поддержка этого.
Если ваш случай, если у вас есть только эти расширенные данные, и ни один из сложных сценариев, упомянутых выше, возможно, вы могли бы обойтись без таблиц базы данных. Например, вы можете использовать перечисление для каждого списка и расширение, в котором вы определяете массив или словарь для вашего перечисления, где вы храните эти дополнительные данные. Вам придется обновлять эти данные в коде каждый раз, когда изменяется список значений.
Пример реализация этого для простого перечисления CategoryStatus
с двумя значениями и и дополнительными LocalizedName
пункта (что позволяет использовать значение Ресурсов для переведенных текстов):
public enum CategoryStatus
{
Active = 0,
Inactive = 1
}
public static class CategoryStatusExtension
{
private static string[] localizedNames = new string[] {
Resources.Strings.CategoryStatus_Active,
Resources.Strings.CategoryStatus_Inactive
};
public static string LocalizedName(this CategoryStatus self)
{
switch (self)
{
case CategoryStatus.Active:
return localizedNames[0];
break;
case CategoryStatus.Inactive:
return localizedNames[1];
break;
}
return null;
//int index = (int)self - 1;
//return localizedNames[index];
}
}
Вы используете это так:
var categoryStatus = CategoryStatus.Active;
var textToUse = categoryStatus.LocalizedName();
Вы также можете найти способ автоматизировать немного больше поиска значений вместо использования явного switch
, как в прокомментированном коде.
Об использовании только одной таблицы для всех перечислений, она снова зависит от этих соображений. Если ваши списки невелики, их не так много, и в будущем вы не получите много новых списков, тогда вам, вероятно, следует использовать отдельные таблицы для каждого перечисления. Я думаю, что ваш код будет легче писать/поддерживать, если вы используете отдельные таблицы.