0

みなさん、こんにちは。読んでくれてありがとう。

私はNHibernateとPostgreSQLを使用していますが、基本的に2つのことを実行したいと考えています。

  1. データベース内のエンティティを永続化しながら、エラーにユーザーフレンドリーなメッセージを提供します
  2. UIを調整して、特定の部分のエラーを表示します(したがって、名前が一意である必要があり、ユーザーが既に存在するものを導入した場合は、名前テキストボックスのツールチップなどとしてエラーを表示したいと思います)。

そのため、制約チェックが失敗する列を見つけることが役立つと思い、これを行うためのクリーンな方法を見つけようとしています。たとえば、フィールドが「Not Null」制約に失敗すると、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 に答える