我该如何正确使用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
方法,我不能去工作。
我做错了什么?
我不知道为什么,但似乎你确实需要使用CheckComponentList
而不是CheckList
。我不确定CheckList
做什么,或者如果它现在工作,但我看了看SQL跟踪和CheckComponentList
正在生成正确的语句。
CheckComponentList
使用默认的相等比较器,除非显式指定,这是不覆盖Equals
的引用类型的引用相等,因此在子实体类中覆盖Equals
或使用接受IEqualityComparer
参数的CheckComponentList
重载之一是至关重要的。
我有一个类似的问题,我的解决方案是避免设置"back"引用(c.p parent = p).我不知道这是否解决了你的问题,但你可以尝试一下。