我正在尝试使用内置于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
方法。
我做错了什么?
答案 0 :(得分:4)
我不确定原因,但您似乎需要使用CheckComponentList
代替CheckList
。我不确定CheckList
做了什么,或者它现在是否正常工作,但我查看了SQL跟踪,CheckComponentList
生成了正确的语句。
CheckComponentList
使用默认的相等比较器,除非明确指定了一个,这对于不覆盖Equals
的引用类型是引用相等,因此覆盖Equals
是至关重要的子实体类或使用带有CheckComponentList
参数的IEqualityComparer
重载之一。
答案 1 :(得分:0)
我有类似的问题,我的解决方案是避免设置“后退”引用(c.Parent = p)。我不知道这是否能解决您的问题,但您可以尝试一下。