我该如何正确使用Fluent NHibernate.Testing CheckList?

时间:2011-07-11 23:00:00

标签: c# .net unit-testing nhibernate fluent-nhibernate

我正在尝试使用内置于FNH中的persistence specification testing。最近似乎添加了CheckList方法,但旧版CheckEnumerable已被弃用,因此我假设CheckList稳定。

我的测试代码与此类似:

new PersistenceSpecification<Parent>(session)
    .CheckProperty(x => x.Foo, 123)
    .CheckList(x => x.Children,
        new Child[] { new Child { Name = "Bob" } },
        (p, c) =>
        {
            p.Children.Add(c);
            c.Parent = p;
        })
    .VerifyTheMappings();

请注意,在映射中,Parent拥有关系(包含Cascade.AllDeleteOrphan() 拥有Inverse)。

当我运行它时,我得到了可怕的“无法将NULL值插入...” SQL Server错误消息,因为NHibernate没有在{{ParentId上设置Child 1}}实体。与忘记在两端设置关联时发生的情况相同。

我检查了一个断点,lambda中的代码甚至没有执行,这显然是没有正确设置关联的原因。

映射本身是完全正确的;我可以编写普通代码来创建和插入实体就好了。这只是我无法工作的CheckList方法。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

我不确定原因,但您似乎需要使用CheckComponentList代替CheckList。我不确定CheckList做了什么,或者它现在是否正常工作,但我查看了SQL跟踪,CheckComponentList生成了正确的语句。

CheckComponentList使用默认的相等比较器,除非明确指定了一个,这对于不覆盖Equals的引用类型是引用相等,因此覆盖Equals是至关重要的子实体类或使用带有CheckComponentList参数的IEqualityComparer重载之一。

答案 1 :(得分:0)

我有类似的问题,我的解决方案是避免设置“后退”引用(c.Parent = p)。我不知道这是否能解决您的问题,但您可以尝试一下。