在HasManyToMany中删除

时间:2012-10-01 12:11:11

标签: nhibernate orm fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有三张桌子 - 1.异常 2.标记 3. Anomaly_Markup

映射 -

    public AnomalyMap()
    {
        Table("anomaly");

        Id(x => x.Id).Column("ID").CustomType("decimal");

        HasManyToMany<DMMarkupData>(x => x.DMMarkupData)
            .Table("anomaly_markup")
            .ParentKeyColumn("ANOMALY_ID")
            .ChildKeyColumn("MARK_UP_ID")
            .Cascade.All()
            .LazyLoad();
    }

    public MarkupDataMap()
    {
        Table("markup");
        Id(x => x.Id).Column("ID");
    }

条件:

  1. 通过Anomaly保存数据 - Anomaly包含MarkupData。它可以节省数据。它与我合作。
  2. 删除标记 - 应删除地图表和标记数据之间的关系。我正面临这个问题。
  3. 有人帮我找出解决方案,如何删除标记数据?

3 个答案:

答案 0 :(得分:0)

根据您发布的内容,您似乎没有在DMMarkupData上定义关系 - &gt;异常,所以NHibernate不会知道从anomaly_markup表中删除MarkupData条目(尽管存在相反的关系)。您可以使用数据库级别级联来解决它,该级联在删除MarkupData时会删除anomaly_markup中的条目,或者您可以在代码和放大器中映射关系。 NHibernate然后NHibernate会为你做级联。

答案 1 :(得分:0)

我发现MarkUpData与Anomaly之间没有任何关系。必须存在相同的关系,您应该通过在映射中使用Inverse属性来指定级联操作的控制。 您可以参考:How to set "cascade delete" option to "Set Null" in Fluent NHibernate?

要删除DMMarkupData,只需从集合中删除对象并调用Save Anomaly。

答案 2 :(得分:0)

NHibernate不管理对象图,它只会持久存在。删除列表中的项目是业务逻辑的责任

(所有带触发器的技巧和解决它的东西导致事务中的不一致和副作用进行更改。从持久性无知的角度来看,不推荐。我只会在遇到性能问题时这样做无法用另一种方式解决。)

您可以使用组件来简化它。只要

  • 您没有从其他地方引用相同的标记
  • 您无需查询与Anomality无关的标记
  • 标记永远不会存在于异常之外

考虑到所有这些,使用组件要容易得多。 (我不知道它是如何用流利的方式调用的,但在xml映射中它被称为“复合元素”)。

使用组件时,无需从数据库中删除标记。您只需将其从其所在的列表中删除即可。