NHibernate fluent hasMany тестирование с определением постоянства

#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