Свободное владение NHibernate - модульное тестирование обратного картирования один ко многим - PullRequest
4 голосов
/ 01 декабря 2009

Я не могу понять, как (или если это вообще возможно) использовать метод Fluent NHibernate PersistenceSpecification<T>.CheckList(...) для проверки обратного отображения один-ко-многим.

Вот что я пытаюсь сделать:

Используя беглый nhibernate на примере блога / поста ванили, я определил отображение постов <-> в блоге один-ко-многим. Одно ограничение, которое я хочу, заключается в том, что сообщение ВСЕГДА должно указывать на блог, которому оно соответствует, с момента его добавления в базу данных. (в основном столбец BlogID в таблице Posts NOT NULL)

По этой причине я определил отображение следующим образом:

public class BlogMap: ClassMap<Blog>
{
    public BlogMap(){
        [...]
        HasMany(x => x.Posts)
            .Inverse()
            .Cascade.All();
}

Класс Blog имеет метод AddPosts(IList<Post> posts), который заботится о обеих сторонах сопоставления, поэтому, когда экземпляры Post вставляются в базу данных, их столбец BlogID уже заполняется соответствующим идентификатором Blog.

Пока все хорошо.

Проблема в том, что при использовании

        new PersistenceSpecification<Blog>(GetSession(), eq)
            .CheckList(c => c.Posts,
                       new [] {new Post{Name = "Post 1"}, new Post{Name = "Post 2"}})
            .VerifyTheMappings();

в модульном тесте отображения я получаю это исключение:

"System.ApplicationException: фактическое число не равно ожидаемому числу"

... что и следовало ожидать, поскольку значение BlogID постов нигде не установлено. Мне интересно, могу ли я каким-то образом получить доступ к экземпляру Blog, созданному за сценой с помощью PersistenceSpecification, поэтому я могу вручную вызвать метод AddBlogs (...) перед выполнением проверок.

Если я удаляю .Inverse() из сопоставления (а также удаляю ограничение базы данных NOT NULL для столбца BlogID), тест проходит.

Есть идеи?

1 Ответ

7 голосов
/ 03 декабря 2009

Я знаю, что это уже отсортировано в списке рассылки, но мы могли бы также поставить ответ на переполнение стека.

У класса PersistenceSpecification есть метод CheckList. Вот пример использования:

_spec.CheckList(x => x.EnumerableOfKittens, kittens, (cat, kitten) => cat.AddKitten(kitten));

Этот метод был добавлен только недавно. Получить последний ствол FNH, если вы не можете его найти.

...