Неисполнимые ссылки на внешние ключи в Effort

Я использую 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 отключить это, чтобы я мог проверить эту таблицу в одиночку?

3 ответа

Решение

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

Стол не один. Если вы хотите одну таблицу, спроектируйте новую таблицу и удалите ограничения и ссылки, используя сценарии.sql. При использовании Entity Framework относительно легко высмеивать вставки, но это может стать довольно интенсивным.

Вы можете создать новый файл.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);

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

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

Другие вопросы по тегам