Как разрешить инициализатору базы данных EF4 CodeFirst работать в процессе разработки, но не запускать в работе - PullRequest
3 голосов
/ 25 марта 2011

Я пытаюсь развернуть мою первую альфа-версию системы в Интернете, чтобы несколько человек начали использовать. При разработке я интенсивно использую DropCreateDatabaseOnModelChange<TContext> (у меня его сейчас нет, поэтому я не могу проверить точное имя) для повторной инициализации базы данных dev каждый раз, когда меняется моя модель. Это происходит в Global.asax.

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

Я рассмотрел #ifdef DEBUG теги, чтобы предотвратить вызов инициализатора базы данных, но мне не нравится это решение. Прямо сейчас у меня развернута отладочная версия, поэтому, если они обнаружат какие-либо ошибки, мне будет легко увидеть и отладить их (это очень альфа-версия, поэтому ее используют лишь немногие избранные и знают, что можно ожидать ошибок).

Какие еще опции у меня есть, чтобы предотвратить сброс Prod DB по коду EF4?

Ответы [ 5 ]

7 голосов
/ 25 марта 2011

А как насчет инверсии управления:

var initializer = container.Resolve<IDatabaseInitializer<Context>>();
Database.SetInitializer(initializer);

В зависимости от конфигурации IoC вы вернете разработку или инициализатор производства.У вас может быть свой файл конфигурации для каждой конфигурации сборки, поэтому вы также можете настроить контейнер IoC по-разному.

public class ThrowExceptionInitializer : IDatabaseInitializer<Context>
{
    public InitializeDatabase(Context context)
    {
        // Custom exception
        throw new InvalidVersionException("The new application version is not supported by the database version");
    }
}
6 голосов
/ 25 марта 2011

Как говорит @Johann, ConditionalAttribute - это, вероятно, решение для очистки здесь:

[Conditional("DEBUG")]
private void InitializeDb()
{
    // Initializer code here
    // DropCreateDatabaseOnModelChange<TContext>
}

и в Global.asax:

public void Application_Start // or wherever it is you're initializing
{
    // This will only be called if the DEBUG constant is defined
    InitializeDb();
}
4 голосов
/ 25 марта 2011

Вы всегда можете создать новую конфигурацию (в дополнение к отладке и выпуску).Затем вы должны определить условный символ компиляции для новой конфигурации.Например, если бы я создал новую конфигурацию с именем LocalDebug (с теми же настройками при отладке по умолчанию), я бы добавил LOCALDEBUG к символам условной компиляции.С этим определением вы можете использовать:

#if LOCALDEBUG
  //do database stuff
#endif

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

2 голосов
/ 25 марта 2011

Вы можете использовать атрибут Conditional, но он не очень отличается от # ifdef

0 голосов
/ 19 января 2012

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

protected void Application_Start(object sender, EventArgs e)
{
  using (var db = new MyDb())
  {
    if (db.Database.Connection.DataSource.IndexOf("sqlexpress", StringComparison.InvariantCultureIgnoreCase) > -1)
    {
        Database.SetInitializer(new MyDbInitializer());
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...