Я не могу понять, как (или если это вообще возможно) использовать метод 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), тест проходит.
Есть идеи?