2

Fluent NHibernateを使用してマッピングを構成していますが、データを読み取るときにすべてが機能しますが、PostgresqlタイプのTimeを持つレコードを挿入または更新しようとすると、エラーメッセージが表示されます。

"ERROR: 42804: column \"run_time\" is of type time with time zone but expression is of type timestamp without time zone"

PostgreSQLおよびC#データ型から、DateTimeがマップされるDbTypeがいくつかあることがわかるように、NHibernateがDateTimeを変換するDbTypeについて混乱している可能性があるようです。

また、IUserTypeからこの列のカスタムタイプを指定しようとしましたが、NullSafeSetオーバーライドでNullReferenceErrorが発生します

public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
    var obj = (DateTime)value;

    NHibernate.NHibernateUtil.Time.NullSafeSet(cmd, obj, index);
}

DateTimeをPostgresqlの「time」タイプに変換するようにNHibernateに指示するために提供できるヒントのタイプはありますか?または、IUserTypeでこれを達成できますが、何か間違ったことをしているだけですか?

4

3 に答える 3

4

理解した!

リンクした変換シートが間違っているか、古くなっているようです。System.TimeSpanオブジェクトは、NpgsqlがPostgresqlの「time」オブジェクトに適切に変換するために必要なものであることがわかりました。彼らが2つの時間の違いを表す何かを私たちがHH:mm:ssと考えるものに変換しようとするのは奇妙に思えますが、それはそうです。

RunTimeプロパティのタイプをSystem.DateTimeからSystem.TimeSpanに変更するのではなく、代わりにカスタムIUserTypeを作成し、NullSafeSetを次のようにオーバーライドしました。

public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
    var obj = (DateTime)value;

    ((IDbDataParameter) cmd.Parameters[index]).Value = new TimeSpan(0, obj.Hour, obj.Minute, obj.Second);
}
于 2011-05-26T12:22:35.837 に答える
0

次のようにマッピングを定義することで、この問題を修正できる場合があります。

Map(x => x.RunTime, "run_time").CustomSqlType("time");
于 2011-05-25T19:33:00.913 に答える
0

NHのデータ型の定義が無効であると思われる場合は、https: //nhibernate.jira.com/browse/NH +で報告できます。その間に、独自の方言を使用してそれを解決できます。何かのようなもの:

public class CustomDialect : OriginalDialect
{
    public CustomDialect()
    {
      //... add your new definitions here to override default values    
    }
}

これで、次のように使用できます。

var dbType = XyzConfiguration.Standard
                       ...
                       .Dialect<CustomDialect>();
于 2011-05-27T17:13:17.957 に答える