#c# #database #nhibernate #testing #fluent-nhibernate
#c# #База данных #nhibernate #тестирование #свободно-nhibernate
Вопрос:
У меня есть таблица, которая определяет команду, у команды есть список параметров, а у параметра должна быть команда. Это означает ссылку в parameterMap:
Id(x => x.Id).Column("GUID_PARAMETER").GeneratedBy.Assigned();
References(x => x.Command).Column("GUID_COMMAND").Cascade.All();
Table("MST_PARAMETER");
и команда hasMany in для заполнения списка:
Id(x => x.Id).Column("GUID_COMMAND").GeneratedBy.Assigned();
HasMany<ParameterEntity>(x => x.ParameterList)
.Table("MST_PARAMETER")
.KeyColumn("GUID_PARAMETER")
.Inverse()
.Cascade.All();
Table("MST_COMMAND");
Затем при попытке проверить, что у команды есть список параметров, я всегда получаю сообщение об ошибке, в котором говорится, что я не могу вставить параметр с помощью команды null.
Для того, что я видел, правильный способ добиться этого — использовать подобный вызов при тестировании командной карты
new PersistenceSpecification<CommandEntity>(_session)
.CheckProperty(c => c.Id, Guid.NewGuid())
.CheckList(c => c.ParameterList, FixtureUtils.GetDefaultParameterListFromCommand(), (command, parameter) => command.AddParameter(parameter))
Это можно проверить?
Ответ №1:
вы установили inverse=true
, какой параметр означает, что он отвечает за ассоциацию. Для этого вы должны установить команду property для параметра:
.CheckList(c => c.ParameterList, FixtureUtils.GetDefaultParameterListFromCommand(), (command, parameter) => { command.AddParameter(parameter); parameter.Command = command; })
Обновить:
.KeyColumn("GUID_PARAMETER")
должно .KeyColumn("GUID_COMMAND")
соответствовать ссылочному объявлению
Комментарии:
1. Ну, это то, что я делал внутри
command.AddParameter(parameter)
метода. На самом деле, когда я отлаживаю внутри AddParameter, похоже, что параметр имеет ссылку на команду, а команда — на параметр. Когда nhibernate вставляет параметр, эта команда имеет НУЛЕВОЙ идентификатор guid.2. Об обновлении: я предполагаю, что это означает, что я могу даже пропустить set KeyColumn name, потому что GUID_COMMAND . Кстати, у меня тоже не работает. У меня есть еще один подобный случай, когда кажется, что все работает немного лучше, потому что вместо исключения в нем говорится
Actual count (0) does not equal expected count (1)
3. нет, вам нужно указать KeyColumn, иначе по умолчанию будет «commandId», а не «GUID_COMMAND», и вставить правильно, но не найти никаких элементов для коллекции при загрузке, отсюда и сообщение об ошибке
4. Да, @Firo я обнаружил, что после повторного прохождения тестов, поскольку он ссылался на него как на command_id в качестве ключа по умолчанию. Спасибо
5. это даже говорит о том, какой параметр отвечает за ассоциацию, он терпит неудачу. Тест начинается с
INSERT INTO MST_PARAMETER...
, что хорошо, но с нулевымGUID_COMMAND
значением, которое выходит из строя из-за ограничений db. @Firo