Константы базы данных в классе

Если у меня есть, скажем, таблица фильмов, которая, помимо прочего, имеет поле int FilmTypeId и таблицу типов фильмов, с идентификатором и содержательным описанием в виде:

  • 1 - ужас
  • 2 - комедия
  • ...

Каков наилучший способ использования этой информации в классе C #?

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

public class FilmHelper
{
    public const int HorrorFilmType = 1;
    public const int ComedyFilmType = 2;
    ...
}

но это не так уж и удобно. Но я хотел бы избегать вызова базы данных каждый раз, когда я прибегал к использованию константы или дополнительного вызова БД каждый раз, когда я использовал либо вспомогательный, либо основной объект.

6 c#
12.12.2008 21:06:27
6 ОТВЕТОВ
РЕШЕНИЕ

Список типов фиксирован или он изменился?

Если исправить, я бы заключил это в перечисление:

public enum FilmType {
   Horror = 1,
   Comedy = 2
}

Тогда просто брось. Вы можете использовать атрибуты (и несколько строк сделанного на заказ кода), чтобы сохранить дополнительное описание для каждого элемента перечисления.

Если список изменится, я, вероятно, однажды прочту его в приложении и кеширую список где-нибудь в поиске (возможно, в статическом, возможно, в определенном кеше). Затем просто выполните поиск из кэшированной копии.

Вы можете пойти дальше, добавив свойства, которые изменяются между двумя представлениями.

6
12.12.2008 21:10:20

Я всегда храню свой код поиска в файлах перечисления, подобных этому

public enum ReportStatus
{
    [Description("Reports that are running")] Running,
    [Description("Reports that are pending to run")] Pending,
    [Description("Reports that have errored while running")] Error,
    [Description("Report completed successfully.")] Finished
}

Для чтения из тегов Description перечисления я использую класс simliar для этого примера из Monsters Got My .NET . Это дает вам возможность одновременно хранить идентификатор, код и описание объекта типа поиска в enum.

1
12.12.2008 21:11:23
Мне нравится идея enum, но в равной степени мне нравится иметь таблицу с идентификатором, означающим на сервере базы данных, так что кому-то понятно, что только смотрит на sql значения идентификаторов.
NikolaiDante 12.12.2008 21:15:30
Несмотря на то, что я ненавижу поиск кода, у меня всегда есть мои перечисления, отражающие их, поэтому вам никогда не нужно обращаться к базе данных, чтобы выяснить их, и у вас есть строгий контроль над ними в вашем коде. От изменения взглядов во время выполнения требуется небольшая гибкость, но я чувствую, что это приемлемый компромисс.
Chris Marisic 12.12.2008 21:21:55

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

1
12.12.2008 21:17:32
Основная причина наличия этого класса также состоит в том, что dal будет структурой сущностей, поэтому я мог бы делать такие вещи, как: Film film = (from f в context.Film, где film.FilmId = HorrorFilmType select f) .FirstOrDefault ();
NikolaiDante 12.12.2008 21:20:30
И вы не могли бы сделать это через поиск по БД?
Joel Coehoorn 12.12.2008 21:26:31
Конечно: о) Я просто объяснял свою ситуацию немного дальше
NikolaiDante 12.12.2008 21:28:20

Вы можете использовать строгий тип без строгого ввода значений.

class FilmType : Dictionary<int, string> {}

Затем просто загрузите значения во время загрузки приложения, как предложил Джоэл.

Если вас больше волнуют фактические значения во время компиляции, то вы не будете делать лучше, чем перечисление.

4
12.12.2008 21:35:33
Я думаю, что они оба лучшие решения, чем у меня, я просто решаю, какой путь выбрать. Спасибо!
NikolaiDante 12.12.2008 21:42:53

Что касается использования перечислений ... в зависимости от того, что представляет значение перечисления (например, столбец IDENTITY), я мог бы добавить столбец StaticIdentifier к моей таблице и сделать поле THAT значением перечисления для поиска (соответствующим образом изменив мои сохраненные процедуры, чтобы принять поле статического идентификатора вместо столбца идентификаторов). Столбцы идентичности неизбежно путаются между DEV, QA и PROD, и мне это не нужно.

1
12.12.2008 22:16:15

Мой ответ предполагает, что вы хотите явно кодировать эти значения в вашей базе данных.

В прошлом я делал сценарий, который создает мои файлы констант. (У меня также был сценарий SQL, который выводил бы код C # при запуске с выводом текста, поэтому я мог просто вставить его в файл и сразу использовать эту константу.)

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

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

2
12.12.2008 22:22:34
кажется, что сложность связана с чем-то, что должно быть довольно простым.
Dementic 31.10.2018 14:51:34