2

我有三个表 - 1. Anomaly 2. Markup 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. 删除标记 - 应该从地图表和标记数据中删除关系。我正面临这个问题。

任何人都帮我找出解决方案,如何删除标记数据?

4

3 回答 3

0

从您发布的内容来看,您似乎没有在 DMMarkupData -> Anomaly 上定义关系,因此 NHibernate 不会知道从 anomaly_markup 表中删除 MarkupData 条目(尽管存在反向关系)。您可以使用数据库级级联解决它,该级联在删除 MarkupData 时删除 anomaly_markup 中的条目,或者您可以在代码和 NHibernate 中映射关系,然后 NHibernate 将为您执行级联。

于 2012-10-01T15:08:13.207 回答
0

我看不到 MarkUpData 与 Anomaly 的关系。必须有相同的关系,您应该在映射中使用 Inverse 属性指定对级联操作的控制。您可以参考:如何在 Fluent NHibernate 中将“级联删除”选项设置为“设置 Null”?

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

于 2012-11-23T09:22:20.787 回答
0

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

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

您可以通过使用组件来简化它。前提是

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

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

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

于 2012-11-23T09:36:41.410 回答