Я использую Effort в Visual Studio и C # для воссоздания и модульного тестирования базы данных. Я пишу класс для одной таблицы, поэтому я только заполняю базу данных объектами из этой таблицы. Моя проблема заключается в том, что база данных Effort хочет, чтобы внешние ключи объекта ссылались на фактические объекты в базе данных.
Моя ошибка
System.Data.Entity.Infrastructure.DbUpdateException: при обновлении записей произошла ошибка. Подробнее см. Внутреннее исключение.
System.Data.Entity.Core.UpdateException: Произошла ошибка при обновлении записей. Подробнее см. Внутреннее исключение.
System.Reflection.TargetInvocationException: Исключение было выбрано целью вызова.
NMemory.Exceptions.ForeignKeyViolationException: Нарушение внешнего ключа [Table1 :: SettingsId]. Значение ключа [0] не существует в ссылочной таблице [Table2 :: SettingsId] .. Код ошибки: RelationError
Поскольку эта конкретная таблица имеет много внешних ключей к объектам, которые имеют много других внешних ключей, для этого потребуется большая работа. Есть ли способ в Effort, чтобы отключить это, чтобы я мог проверить эту таблицу в одиночку?
Я тоже столкнулся с этой проблемой и хотел проверить таблицу в области большей базы данных. Вы можете создать вспомогательный метод, который будет просто создавать все, что вам нужно, и передать базу данных или таблицу со ссылками. Это помогает, потому что вы можете называть это от того, какой метод / класс теста вам нужен и когда вам нужно.
Вы можете создать новый .edmx-файл из своей базы данных только для тестирования. Например:
В Visual Studio выберите File-> New-> Data-> Entity DataModel. Выберите «EF Designer из базы данных». Выберите или создайте соединение с существующей базой данных SQL Server и сохраните настройки подключения в app.config как «testConnectionString».
В дизайнере модели данных удалите любые отношения внешнего ключа, которые вам не нужны. Сохраните конструктора и перестройте проект.
В Effort передайте имя строки соединения (которая была сгенерирована при создании нового .edmx) методу CreateTransient
, например:
EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");
MyDbContext context = new MyDbContext(connection);
Это должно позволить вам вставлять значения в таблицу, не заполняя соответствующие таблицы внешних ключей.
Это связано с предупреждением, хотя, если тестируемый код использует любые свойства навигации, зависящие от внешних ключей, он не сработает. Это заставляет меня задаться вопросом, насколько ценным является такое «модульное тестирование».