Как правильно использовать контрольный список FluentNHibernate.Testing? - PullRequest
3 голосов
/ 12 июля 2011

Я пытаюсь использовать тестирование спецификации персистентности , встроенное в FNH. CheckList метод, кажется, были добавлены в последнее время, но чем старше CheckEnumerable уже устарел, поэтому я предполагаю, что CheckList устойчива.

Мой тестовый код выглядит примерно так:

new PersistenceSpecification<Parent>(session)
    .CheckProperty(x => x.Foo, 123)
    .CheckList(x => x.Children,
        new Child[] { new Child { Name = "Bob" } },
        (p, c) =>
        {
            p.Children.Add(c);
            c.Parent = p;
        })
    .VerifyTheMappings();

Обратите внимание, что в отображении Parent принадлежит отношение (имеет Cascade.AllDeleteOrphan(), а не имеет Inverse).

Когда я запускаю его, я получаю страшное «Невозможно вставить NULL-значение в ...» Сообщение об ошибке SQL Server, поскольку NHibernate не устанавливает ParentId для объекта Child. То же, что происходит, когда вы забыли установить связь на обоих концах.

Я проверил с точкой останова, и код внутри лямбды даже не выполняется Выполнено , поэтому очевидно, что связь не установлена ​​должным образом.

Сами отображения совершенно верны; Я могу написать обычный код для создания и вставки сущности просто отлично. Это просто метод CheckList, который я не могу заставить работать.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Я не уверен, почему, но, похоже, вам нужно использовать CheckComponentList вместо CheckList.Я не уверен, что делает CheckList или работает ли он вообще сейчас, но я посмотрел на трассировку SQL и CheckComponentList генерировал правильные операторы.

CheckComponentList использует компаратор равенства по умолчаниюесли не указано явно, то есть равенство ссылок для ссылочных типов, которые не переопределяют Equals, поэтому важно либо переопределить Equals в дочернем классе сущности, либо использовать одну из перегрузок CheckComponentList, которая принимает IEqualityComparer аргумент.

0 голосов
/ 12 июля 2011

У меня была похожая проблема, и мое решение состояло в том, чтобы избежать установки «обратной» ссылки (c.Parent = p).Я не знаю, решит ли это вашу проблему, но вы можете попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...