2009-08-29 4 views
2

Я новичок в ASP.NET, опыт работы с WinForms и WPF. Полегче со мной.Есть ли способ сохранить перечисления из базы данных?

Когда моя страница загружается, она попадает в базу данных и запрашивает таблицу для выбора в раскрывающемся списке. Теперь, если вы сделаете обратную передачу на странице, перезагрузите значения в form_load? Кажется ненужным ударить по базе данных дважды. Мое предположение состоит в том, что я помещал form_load, я попадал в базу данных для перечислений, а затем заполнял выпадающие значения, которые я нашел.

ответ

1

Я предполагаю, что вы говорите о «таблице поиска», в основном что-то, что имеет схему {Id, Name} и ссылается как внешний ключ из другой таблицы, правильно?

Это вековой вопрос, и нет «правильного» ответа.

Если ваше перечисление, скорее всего, изменится вообще (возможно, оно контролируется административным пользователем), вы не сможете использовать предложение @Andrei Rinea, так как вам нужно будет обновить значение из базы данных. В конечном счете, вам будет лучше делать то, что предлагает Keltex, и скопировать результаты с коротким сроком действия - возможно, всего за 5 минут. Просто небольшое количество кэширования может значительно повысить производительность, если вы находитесь под большой нагрузкой.

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

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

1

Они могут быть загружены при запуске приложения в объекте Application. Полагаю, они не изменятся слишком часто.

Тогда используется оттуда. Для таких «каталогов», которые редко меняются (один раз в год или меньше), я часто кодирую их в тип перечисления.

Edit:

Для перечислений, таких как PaymentStatus или такие, которые меняются редко или никогда в C# перечисления отображенный в каталог, имеющий те же числовые значения, так как Randolpho сказал ок. Для других кешей в объекте HttpRuntimeCache («Кэш») и поставить либо абсолютное истечение либо SqlDependency

+0

не очень надежный. что, если мое приложение работает очень долго, а перечисления меняются несколько чаще, чем это? – MedicineMan

+0

Для перечислений, таких как PaymentStatus или таких, которые редко или никогда не изменяются в перечислении C#, сопоставленных с каталогом с одинаковыми численными значениями, как сказал Рэндольффо. Для кэша других в объекте HttpRuntimeCache («Кэш») и либо абсолютное истечение, либо SqlDependency –

2

Вы управляете тем, что вызывается во время обратной передачи с Page.IsPostBack. Он возвращает логическое значение, указывающее, когда страница находится в обратной передаче. Пример:


public partial class _Default : System.Web.UI.Page { 
    protected void Page_Load(object sender, EventArgs e) { 
     if (!this.IsPostBack) { 
      // fill the enums 
     } 
    } 
} 

2

Используйте объект Cache и храните результаты в базе данных базы данных.