【问题标题】:NHibernate: Laziness.NoProxy prevents soft deleteNHibernate:Laziness.NoProxy 防止软删除
【发布时间】:2012-08-13 00:12:18
【问题描述】:

我有这个用于 NHibernate 映射:

    public AnswerSet_AnswerMap() {
        Table("DB.AnswerSet_Answer");
        Id(x => x.AnswerSet_AnswerId);
        References(x => x.Answer, "BaseAnswerID").LazyLoad(Laziness.NoProxy);
        References(x => x.AnswerSet, "AnswerSetID").Fetch.Join();
        Map(x => x.Format);
    }

它用于“AnswerSet”和“Answer”之间的连接表。答案引用上的 .LazyLoad(Laziness.NoProxy) 在我们的应用程序中是必需的,但它可以防止 AnswerSet_Answer 对象在数据库中被软删除(它在数据库中保持不变)。有谁知道为什么会这样?

【问题讨论】:

  • “软删除”意味着您实际上并未删除该行,而是设置一个列以指示它已“删除”。 NHibernate 不会为您这样做。您是在询问如何级联实际删除?
  • 我想是的。我的实际类实现了另一个使其软删除的类,所以我想那是在 NHibernate 之外。
  • “答案参考上的 .LazyLoad(Laziness.NoProxy) 在我们的应用程序中是必需的”

标签: c# asp.net nhibernate proxy lazy-evaluation


【解决方案1】:

您是否尝试添加级联? Cascade.DeleteAllOrphan ?

NHibernate 级联: 实体与其他对象有关联,这可能是与单个项目的关联(多对一)或与集合的关联(一对多、多对任意)。 无论如何,您可以告诉 NHibernate 自动遍历实体的关联,并根据级联选项进行操作。例如,使用 save-update 级联将未保存的实体添加到集合中将导致它与其父对象一起保存,而无需我们方面的任何明确说明。 以下是每个级联选项的含义:

none - 不做任何级联,让用户自己处理。 保存更新 - 保存/更新对象时,检查关联并保存/更新任何需要它的对象(包括保存/更新多对多场景中的关联)。 delete - 当对象被删除时,删除关联中的所有对象。 delete-orphan - 当对象被删除时,删除关联中的所有对象。除此之外,当一个对象从关联中删除并且不与另一个对象关联(孤立)时,也将其删除。 all - 当一个对象被保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。 all-delete-orphan - 当一个对象被保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。除此之外,当一个对象从关联中移除并且不与另一个对象关联(孤立)时,也将其删除。

但 cascade 会删除您的 orpahnd 记录,而不是“软删除”它。 如需软删除,请查看此链接:Soft Deletes In NHibernate

【讨论】:

  • 对于 hasmany 关系来说,这不是更多吗?在我的例子中,我有一个 BaseAnswer 表和多种其他类型的“Answer”表,其中这些表中的每条记录在 BaseAnswer 中都有一条记录。
猜你喜欢
  • 2018-12-29
  • 2018-08-14
  • 2017-05-29
  • 1970-01-01
  • 2020-05-20
  • 2013-06-05
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多