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

时间:2009-11-30 21:36:29

标签: unit-testing fluent-nhibernate nhibernate-mapping orm

我无法弄清楚如何(或者如果可能的话)使用Fluent NHibernate PersistenceSpecification<T>.CheckList(...)方法来检查 - 很多地图。

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

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

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

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

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();

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

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

我知道这已经在邮件列表中排除了,但我们也可以将答案放在堆栈溢出上。

PersistenceSpecification类有一个CheckList方法。以下是一个示例用法:

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

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