删除时流畅的Nhibernate外键约束抛出异常

时间:2011-05-11 19:20:35

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

我有一对多关系:

对象ReportCategory:

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。

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

由于

1 个答案:

答案 0 :(得分:2)

使类别引用不可为空:

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();