我该如何正确使用FluentNHibernate.Testing's CheckList ?

本文关键字:CheckList Testing FluentNHibernate 何正确 | 更新日期: 2023-09-27 18:02:00

我正在尝试使用FNH内置的持久性规范测试。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)。

当我运行它时,我得到了可怕的"Cannot insert NULL value into…" SQL Server错误消息,因为NHibernate没有在Child实体上设置ParentId。与忘记在两端设置关联时发生的情况相同。

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

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

我做错了什么?

我该如何正确使用FluentNHibernate.Testing's CheckList ?

我不知道为什么,但似乎你确实需要使用CheckComponentList而不是CheckList。我不确定CheckList做什么,或者如果它现在工作,但我看了看SQL跟踪和CheckComponentList正在生成正确的语句。

CheckComponentList使用默认的相等比较器,除非显式指定,这是不覆盖Equals的引用类型的引用相等,因此在子实体类中覆盖Equals或使用接受IEqualityComparer参数的CheckComponentList重载之一是至关重要的。

我有一个类似的问题,我的解决方案是避免设置"back"引用(c.p parent = p).我不知道这是否解决了你的问题,但你可以尝试一下。