流畅的NHibernate - 单元测试一对多*逆*映射

Cri*_*scu 4 orm unit-testing nhibernate-mapping fluent-nhibernate

我无法弄清楚如何(或者如果可能的话)使用Fluent NHibernate PersistenceSpecification<T>.CheckList(...)方法来检查一对多映射.

这是我正在尝试做的事情:

在vanilla博客/帖子示例中使用流畅的nhibernate,我已经定义了一对多的博客< - >帖子映射.我想要的一个限制是,帖子必须始终指向它对应的博客,从它添加到数据库的那一刻起.(基本上,Posts表中的BlogID列是非NULL)

出于这个原因,我定义了这样的映射:

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

Blog类有一个AddPosts(IList<Post> posts)方法来处理映射的两个方面,因此当在数据库中插入Post实例时,他们的BlogID列已经填充了相应的博客ID.

到现在为止还挺好.

问题是,使用时

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

在映射单元测试中,我得到了这个例外:

"System.ApplicationException:实际计数不等于预期计数"

...这是预期的,因为帖子的BlogID值没有设置在任何地方.我想知道我是否能以某种方式访问Blog由幕后创建的实例PersistenceSpecification,因此我可以在进行检查之前手动调用AddBlogs(...)方法.

如果我.Inverse()从映射中删除了(并且还删除了BlogID列的数据库NOT NULL约束),则测试通过.

有任何想法吗?

Pau*_*tum 7

我知道这已经在邮件列表中进行了整理,但我们也可以将答案放在堆栈溢出上.

PersistenceSpecification类具有CheckList方法.这是一个示例用法:

_spec.CheckList(x => x.EnumerableOfKittens, kittens, (cat, kitten) => cat.AddKitten(kitten));
Run Code Online (Sandbox Code Playgroud)

最近才添加此方法.如果找不到,请获取最新的FNH主干.