我无法弄清楚如何(或者如果可能的话)使用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约束),则测试通过。
有什么想法吗?
答案 0 :(得分:7)
我知道这已经在邮件列表中排除了,但我们也可以将答案放在堆栈溢出上。
PersistenceSpecification类有一个CheckList方法。以下是一个示例用法:
_spec.CheckList(x => x.EnumerableOfKittens, kittens, (cat, kitten) => cat.AddKitten(kitten));
此方法最近才添加。如果找不到,请获取最新的FNH主干。