【问题标题】:HasOne Identifying Relationship Not SavingHasOne 识别关系未保存
【发布时间】: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


    【解决方案1】:

    我的猜测是 parent.Id 是由身份生成的。

    session.SaveOrUpdate(_Parent); 行将保存父级以获取其 id 并缓存子级的插入以在提交时刷新。然后session.Clear(); 将删除缓存的插入,transaction.Commit(); 将找不到任何可做的事情。

    【讨论】:

    • 谢谢,Firo - 这就是答案。我不明白为什么 nHibernate 会保存父对象,但在事务提交之前不会保存子对象。它几乎就像一个门面。我想这是一个性能优势。无论如何,感谢您的出色回答。
    • 是的,它提高了性能,因为所有插入都在一次往返中发送,除了身份之外,NH 必须发出插入以获取 ID
    猜你喜欢
    • 1970-01-01
    • 2020-04-09
    • 2021-04-17
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多