Как предотвратить изменение базы данных DbContext?

Я изучаю Entity Framework (в настоящее время использую бета-версию EF6), и я использую первый шаблон кода в существующей базе данных. Объекты и класс DbContext создаются автоматически с использованием шаблона T4.

Я хотел бы предотвратить DbContext от создания/изменения чего-либо в базе данных во время выполнения.

Как я могу это сделать?

Ответ 1

Когда вы выполняете команду enable-migrations, вам будет представлена ​​папка /Миграции, в которой вы можете найти файл с именем Configuration.cs, Внутри конструктора этого файла по умолчанию установлено значение свойства:

 AutomaticMigrationsEnabled = false;

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

Однако, если ваша база данных больше, чем ваши модели домена, т.е. вы просто работаете с частью уже существующей базы данных, то где-то в вашем приложении запускается (если это приложение ASP.NET, Application_Start обработчик событий), вам нужно добавить следующий код:

Database.SetInitializer<YourDbContext>(null);

В противном случае Entity Framework будет жаловаться на несоответствие между определением базы данных в вашей модели домена и фактическим текущим состоянием базы данных.

EDIT:

Если вы хотите быть уверены, что YourDbContext не пытается изменить базу данных, сделайте следующее:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new YourCustomException("Code first changes are not allowed."); 
}

ИЗМЕНИТЬ еще раз:

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

  • Используйте шаблон генератора DbContext для генерации DbContext и объектов из существующей базы данных.
  • Запуск разрешения-миграции
  • Сделать add-migration Initial
  • Шаг 3 должен генерировать пустую миграцию, если все было сделано должным образом. Вы можете удалить его.
  • Теперь, когда вы делаете какие-то изменения, вам нужно сделать add-migration Сменить имя. Это не будет работать в базе данных, если вы не выполните обновление-базы данных.

Ответ 2

Установите для инициализатора для вашего контекста значение null.

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

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

Ответ 3

У меня была эта проблема с DBFirst и EF 6.1, она создавала новую таблицу на основе EntityName. Поэтому я изменил виртуальный метод OnModelCreating для отображения моих таблиц.

Итак, если EntityName был назван MyStuffs, поскольку по умолчанию имена EnitityNames имеют множественность, которые у вас есть, чтобы отменить выбор во время генерации EF. В моем случае мастер создавал множественную версию таблицы.

public class MyContext: DbContext
{
    public MyContext()
        : base("name=MyEntityConnectionName")
    {
    }
    public MyContext(string connectionString)
        : base(connectionString)
    {
    }
    #region methods

    public static MyContext Create()
    {
        return new MyContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // Map Entities to their tables.
        modelBuilder.Entity<MyModel>().ToTable("MyStuff"); //prevent a new table from being added since we added a mapping
    }

    #endregion
    public virtual DbSet<MyModel> MyEntities{ get; set; }
}