0

大家好,感谢阅读。

我正在使用 NHibernate 和 PostgreSQL,基本上我想做两件事:

  1. 在将实体持久保存在数据库中时,为错误提供用户友好的消息
  2. 调整 UI 以显示特定部分中的错误(因此,如果名称必须是唯一的并且用户介绍了一个已经存在的名称,我想将错误显示为名称文本框的工具提示或其他任何内容)。

所以我认为找到约束检查失败的列会很有用,我正试图找到一种干净的方法来做到这一点。例如,当字段未通过“非空”约束时,NHibernate 会抛出 PropertyValueException,并且此(异常)类有一个名为“PropertyName”的属性,它告诉我未通过约束的属性。这是我想要得到的,但是获取列听起来更容易,我想我可以从列名中获取相关属性。

那么,有没有一种(干净的)方法可以从 NpgsqlException 中提取相关列?或者使用 NHibernate 类似的东西?

4

1 回答 1

1

有用于此目的的钩子 ISqlExceptionConverter。配置它

config.SetProperty(NHibernate.Cfg.Environment.SqlExceptionConverter, typeof(MyNpgSqlExceptionConverter));

或者

using NHibernate.Cfg.Loquacious;

config.DataBaseIntegration(d => d.ExceptionConverter<MyNpgSqlExceptionConverter>());

并像这样实现它

class MyNpgSqlExceptionConverter : ISQLExceptionConverter
{
    public Exception Convert(AdoExceptionContextInfo adoExceptionContextInfo)
    {
        var npgsqlException = (NpgsqlException)adoExceptionContextInfo.SqlException;

        switch (npgsqlException.Code)
        {
            case "<errorcode for duplicate key>":
                return new WhateverException(...);
                break;
            default:
                break;
        }
    }
}
于 2013-01-07T09:36:39.847 回答