【发布时间】:2012-01-22 10:21:09
【问题描述】:
我在数据库中的两个表之间有一个识别关系。
父表有一个通过身份生成的主键。子表有一个主键,它是父表中身份生成的主键。这是真正的一对一。
我尝试了几种映射策略,结果五花八门,没有一个是完美的。
父映射文件有这个(注意 Cascade.All() - 我希望父映射管理关系):
HasOne(x => x.ChildObject).Cascade.All();
子映射有这个:
Id(Reveal.Member<ChildObject>("ID"))
.GeneratedBy.Foreign("ParentObject");
HasOne(Reveal.Member<ChildObject, ParentObject>("ParentObject"))
.Constrained()
.ForeignKey();
我更改了对象名称以保护无辜者。
所以这就是发生的事情。我创建了一个父实例,我创建了一个子实例并设置了关系(将子对象添加到父对象,将父对象添加到子对象)。
我运行这段代码:
session.SaveOrUpdate(_Parent);
session.Clear();
transaction.Commit();
我期望发生的是父级被保存,ID 在父级中从数据库中更新。然后在 Child 中设置 ID,并保存 Child。
相反,Parent 被保存,但 Child 没有被保存(我可以看到 nHibernate 正在执行插入语句,并且 Child 对象从未出现在数据库中)。
子项具有来自父项的 ID(它正确地从父项传播到子项),但 nHibernate 不认为子项是脏的(我的猜测)。即使我在子对象上明确尝试 SaveOrUpdate,它也不会被保存。
但它变得有点奇怪。如果我将脏对象的集合附加到子对象,并在子对象上调用 SaveOrUpdate 显式,nHhiberante 将保留子对象和集合 - 预期的行为。但我还是得显式地调用它。
我在映射父子关系时犯了什么错误?
【问题讨论】:
标签: c# nhibernate fluent