0

Я нахожусь в затруднительном положении, когда у меня есть несколько списков как часть бизнес-логики, которые должны быть выпадающими (w/Id как значение и FriendlyName как Description) на интерфейсе.Управление TypeLists w/Entity Framework

Кроме того, я буду делать разные вещи в бизнес-логике на основе сохраненного выбора базы данных. Это означает, что мне понадобится GlobalConstants или Enums, которые соответствуют идентификаторам в моем коде.

Должен ли я использовать Enums, создать таблицу для каждого отдельного списка или создать общие таблицы под названием TypeList и TypeListItem при использовании EF?

ответ

0

Этот ответ не дает конкретного решения вашей проблемы, но я надеюсь, что это может дать вам некоторый намек.

В этой проблеме есть несколько сообщений, например 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, как в прокомментированном коде.

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

Смежные вопросы