【问题标题】:NHibernate delete problem in one-to-many relationship一对多关系中的NHibernate删除问题
【发布时间】:2010-11-26 23:54:29
【问题描述】:

我有 A 和 B 类的映射,其中“一”侧是 A,“多”侧是 B。B 引用 A,其中外键不可为空。使用 FluentNH 将 A 集映射为 B 的 Cascade.Delete()。当我尝试删除 A 时,NHibernate 会尝试更新 B 并将外键设置为空。由于外键不可为空,因此会发生错误。

我该怎么办?使外键可以为空?

编辑:当我将外键设置为可为空时,它可以工作。但这是正确的方法吗?

【问题讨论】:

    标签: nhibernate fluent-nhibernate one-to-many cascade


    【解决方案1】:

    我遇到的另一个解决方案如下:

    HasMany(a => a.B).Cascade.AllDeleteOrphan().Inverse();
    

    如果您希望 a.B.Clear() 删除所有 B,则需要 DeleteOrphan。

    编辑:因为你只是级联删除,这里只是删除:

    HasMany(a => a.B).Cascade.Delete().Inverse();
    

    inverse 属性是说对于从 A 到 B 的关系,拥有该关系的是 A(即 B)的倒数(它在数据库中有 FK)。你可以阅读更多关于逆向Inverse Attribute in NHibernate

    【讨论】:

      【解决方案2】:

      这是因为 NHibernate 尝试将记录上的外键列设置为空,但是由于您不允许该列中存在空值,因此数据库服务器会抛出错误。尝试使用 .Cascade.AllDeleteOrphan() 而不是 Cascade.Delete():

      在A映射类中:

      HasMany(x => x.B)
              .Inverse()
              .Cascade.AllDeleteOrphan()
              .KeyColumn("foreignKeyID");
      

      【讨论】:

      • 我认为您的解决方案会起作用,但由于 Inverse(),而不是 AllDeleteOrphan()。我用 Cascade.Delete() 进行了尝试,它可以工作。
      【解决方案3】:

      没有项目上下文很难回答这个问题。

      在问题域中,有一个 B 而没有一个 A 是否有效?

      如果是这样,外键可以为空。

      如果没有,你需要想办法在它的父A被删除时,把所有的B都删除。

      【讨论】:

        猜你喜欢
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多