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约束),则测试通过.
有任何想法吗?
我知道这已经在邮件列表中进行了整理,但我们也可以将答案放在堆栈溢出上.
PersistenceSpecification类具有CheckList方法.这是一个示例用法:
_spec.CheckList(x => x.EnumerableOfKittens, kittens, (cat, kitten) => cat.AddKitten(kitten));
Run Code Online (Sandbox Code Playgroud)
最近才添加此方法.如果找不到,请获取最新的FNH主干.