【问题标题】:Fluent Nhibernate foreign key constraint throw exception on deleteFluent Nhibernate 外键约束在删除时抛出异常
【发布时间】:2011-05-11 19:20:34
【问题描述】:

我有一个一对多的关系:

对象报告类别:

Table("RCA_REPORT_CATEGORY");
    Id(r => r.Id, "RCA_ID");
    Map(r => r.Name, "RCA_NAME");
    HasMany<Report>(r => r.Reports)
        .Table("REP_REPORT")
        .KeyColumns.Add("REP_RCA_ID").Cascade.None();

对象报告:

Table("REP_REPORT");
        Id(r => r.Id, "REP_ID");
        Map(r => r.Name, "REP_NAME");
        References(r => r.Category, "REP_RCA_ID")
            .Cascade.None();

REP_REPORT.REP_RCA_ID 上有一个外键引用 RCA_REPORT_CATEGORY.RCA_ID。

当我删除具有报告的 ReportCategory 时,它可以工作,并且报告表中的 REP_RCA_ID 列设置为 NULL。 但我不想那样。我想抛出一个异常并告诉我该类别不能被删除,因为它被报告使用并且它违反了外键约束。我怎样才能做到这一点?

【问题讨论】:

    标签: .net database fluent-nhibernate nhibernate-mapping


    【解决方案1】:

    使类别引用不可为空:

    Table("REP_REPORT");
            Id(r => r.Id, "REP_ID");
            Map(r => r.Name, "REP_NAME");
            References(r => r.Category, "REP_RCA_ID")
                .Not.Nullable()
                .Cascade.None();
    

    那么数据库列REP_RCA_ID不能为NULL,尝试删除非空类会导致SQL异常。应首先在您的域模型中避免这种情况,并且仅当您的应用程序中存在错误时才应抛出来自 db 的异常。

    也许您应该将 HasMany 集合标记为反向以避免某些 troubles

    Table("RCA_REPORT_CATEGORY");
        Id(r => r.Id, "RCA_ID");
        Map(r => r.Name, "RCA_NAME");
        HasMany<Report>(r => r.Reports)
            .Table("REP_REPORT")
            .Inverse()
            .KeyColumns.Add("REP_RCA_ID").Cascade.None();
    

    【讨论】:

    • 感谢 Jakub,我刚刚添加了 Inverse() 并且它有效,我现在有一个 GenericADOException。我想我会有一个更精确的例外。在这种情况下, Not.Nullable() 并不是我真正想要的。报告不一定要有类别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多