UnintentionalCodeFirstException | Тестирование модуля Entity Framework с использованием Effort.Ef6 с использованием базы данных First


Вопрос

Ситуация

Я хочу включить модульное тестирование моего DbContext на основе сущности framework 6. Я создал свой DbContext и мои модели с первым подходом к базе данных и теперь имеет файл конструктора .edmx .

Проблема

Мой автоматически созданный DbContext переопределяет метод DbContext.OnModelCreating следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Я пытаюсь создать новый экземпляр моего DbContext в моем DbContext сервисе доступа к данным на основе информации этой статьи . Мой код не запускается в Database.SetInitializer; как отметил автор этого сообщения в блоге. Мой конструктор выглядит как его. Моя инициализация DbContext выглядит так:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Это приводит к следующему исключению при достижении ранее упомянутого переопределенного OnModelCreating

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: «Контекст используется в режиме Code First с кодом, который был сгенерирован из файла EDMX для разработки Database First или Model First. Это будет работать неправильно. Чтобы устранить эту проблему, не удаляйте строку кода, которая выдает это исключение. Если вы хотите использовать Database First или Model First, убедитесь, что строка подключения Entity Framework включена в app.config или web.config проекта запуска. Если вы создаете свой собственный DbConnection, убедитесь, что это EntityConnection, а не какой-либо другой тип DbConnection, и передайте его одному из базовых конструкторов DbContext, которые принимают DbConnection. Чтобы узнать больше о Code First, Database First и Model First, см. Документацию по Entity Framework здесь: http://go.microsoft.com/fwlink/?LinkId=394715 '

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

То, что я уже пытался сделать

  • Поиск в Интернете долгое время для решения.
  • OnModelCreating() переопределенное OnModelCreating() .
  • Я уже пытался применить это решение без успеха.
  • DbContext мой DbContext с помощью Moq , который определенно не является вариантом.

Вопрос

Как я могу создать и использовать базу данных в памяти (с усилием)?


Дополнительная информация

Когда я раскомментирую OnModelCreating() , исключение будет OnModelCreating() при первом доступе к DataContext. Например:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

System.Data.Entity.ModelConfiguration.ModelValidationException: «В процессе генерации модели были обнаружены одна или несколько ошибок проверки: MyApplication.Shared.Model.KeyValuePair:: EntityType« KeyValuePair »не имеет определенного ключа. Определите ключ для этого EntityType. KeyValuePairs: EntityType: EntitySet «KeyValuePairs» основан на типе «KeyValuePair», который не имеет определенных ключей ».

Принятый ответ

Проблема заключалась в том, что мне пришлось указать ключ для моего набора данных KeyValuePair.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
    base.OnModelCreating(modelBuilder, null);
}

Большое спасибо Роберту Жергенсгаарду Энгдалю !





Лицензировано согласно: CC-BY-SA
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему