Как заполнять данные EF Core 2.1 без этих данных всегда в памяти - PullRequest
0 голосов
/ 21 сентября 2018

Visual Studio 2017 Версия 15.8.4

.NET Core 2.1

Microsoft.EntityFrameworkCore 2.1.3

Согласно прочитанному руководству, заполнение данных - это метод, который я должен использовать для создания миграции, которая вставляет данные. EntityTypeBuilder.HasData - это метод, который используется для обеспечения того, чтобы миграция содержала код для вставки данных, а DbContext.OnModelCreating - время для этого.

Iу меня есть большая таблица, которую я заполняю из файла в DbContext.OnModelCreating.У меня также есть тестовый проект NUnit, который содержит интеграционный тест, который выполняет код, касающийся базы данных.Этот тест в настоящее время не проходит, потому что создание моего производного DbContext приводит к вызову OnModelCreating, который пытается открыть мой большой файл и импортировать его.Поскольку мой тестовый проект создает мой контекст выполнения, относительный путь к моему файлу данных отличается, поэтому он не может найти файл и выдает исключение.

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

Итак, я могу удалить код в OnModelCreating, который читает этот файл (и вдруг мои тесты проходят),но если я сделаю это, в следующий раз, когда я добавлю миграцию, код в Migration.Up уничтожит содержимое этой таблицы.Если только я не удалю вызов EntityTypeBuilder.HasData для этой таблицы, сгенерированный в ModelSnapshot, который выглядит как очень грязный хак, и который мне придется вручную отменить перед выполнением подобной серии грязных хаков в будущем в любое время, когда я захочу изменитьсодержимое этой таблицы.

Итак, вопрос в том, как предоставить начальные данные для миграции без автоматической загрузки этих данных в память при создании экземпляра DbContext и без ручного редактирования ModelSnapshot?

1 Ответ

0 голосов
/ 21 сентября 2018

Если я вас правильно понял, вы хотите вернуть DbContext в исходное состояние (без отслеживаемых объектов) после сохранения начальных данных.Если это так, отсоедините все сущности, отслеживаемые с помощью DbContext:

foreach( var entry in this.ChangeTracker.Entries() )
{
    entry.State = EntityState.Detatched;
}

Редактировать:

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

...