Использование Effort (EF Testing Tool) с вычисляемым столбцом
У меня есть ряд интеграционных тестов, которые напрямую обращаются к БД - создают обязательные объекты теста - выполняют тесты, а затем очищают их - однако я хотел попробовать тот же подход в памяти.
Я только что использовал Effort в своем проекте, и он работает очень легко. Однако я столкнулся с проблемой, которую пытался, но не смог решить.
Одна из таблиц, которые мне нужно заполнить фиктивными данными - в качестве предварительного условия теста - содержит вычисляемый столбец (nvarchar, а не null). Что касается объема теста, мне действительно не важно значение этого столбца, но даже если я пытаюсь вставить фиктивные данные, мои данные игнорируются, а затем я получаю сообщение об ошибке:
"Column 'x' cannot be null. Error code: GenericError"
В моих тестах я использую тот же файл edmx, который используется в реальном коде. Это мешает мне постоянно обновлять копию edmx.
Есть ли способ, которым я могу заставить тест обновить EDMX (во время выполнения), чтобы этот столбец обнуляемый не вычисляемый столбец? [переопределение OnModelCreating] или есть способ вставить значение по умолчанию (что-нибудь идет для этого столбца), чтобы остановить эту ошибку? [переопределение SaveChanges]
В настоящее время я пробовал следующее:
- Присоединение объектов с использованием.Attach() вместо.Add()
- Установка EntityState на Неизменный после добавления
- Принудительное значение через Entry.OriginalValues [это значения, поскольку сущность находится в состоянии добавления]
Редактировать:
Я попытался переопределить метод OnModelCreating, но безрезультатно, поскольку это DB-First.
modelBuilder.Entity<Entity_Name>().Property(p => p.x).IsOptional().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
1 ответ
Причиной проблемы была ошибка в базе данных Effort. Когда вычисляемый столбец основан на столбцах, не допускающих значения NULL, вычисляемый столбец также автоматически становится ненулевым. Поэтому база данных Effort ожидала ненулевое значение. С последним обновлением проблема решена. Вы должны установить глобальный EntityFrameworkEffortManager.UseDefaultForNotNullable
пометить как правда.
Смотрите вопрос на GitHub
Откройте файл EDMX в редакторе XML, найдите свою сущность в StorageModels и добавьте в определение столбца StoreGeneratedPattern="Computed"
,
Но если вы обновите или удалите и добавите эту таблицу, вы потеряете эту модификацию. На самом деле вы можете написать консольное приложение, которое обновит ваш файл edmx и добавит StoreGeneratedPattern="Computed"
где это необходимо, и вы можете добавить эти приложения для предварительной сборки событий в студии.