2011-01-21 8 views
2

システム識別子に使用されるSystem.Int64にほぼ対応するカスタムタイプがあります(基本的なlong値の可能性に関するいくつかの追加の制約があります)。OCP.netを使用したInt64に対応するIUserType

またIUserTypeは、私たちはNHibernateので、このタイプのプロパティをマップするが、Oracleデータベースに対して実行しているときに我々は"Int/Decimal Problem"

として知られている関連部分のようです何に実行できるように定義されたんですユーザータイプ(/セットを取得)はここにある:

public object NullSafeGet(IDataReader rs, string[] names, object owner) { 
    var longValue = Convert.ToInt64(NHibernateUtil.Int64.NullSafeGet(rs, names[0])); 
    return new Identifier(longValue); 
} 

public void NullSafeSet(IDbCommand cmd, object value, int index) { 
    if (value == null || ((Identifier)value).IsNew) { 
     NHibernateUtil.Int64.NullSafeSet(cmd, null, index); 
     return; 
    } 
    NHibernateUtil.Int64.NullSafeSet(cmd, ((Identifier)value).Value, index); 
} 

識別子プロパティが含まれている何かを保存しようとしたときに我々は現在、ISessionのするsaveOrUpdateメソッドから無効なキャスト例外を取得しています。

oracleとSQLサーバーの両方で動作するようにこの問題を処理する方法はありますか、あるいは2つの異なるUserType実装を作成する必要がありますか?

答えて

1

もう少し調査したところ、問題はsequence-identity generation strategyであると思われます。道それはSQLサーバー上で(単一のクエリとインサートとIDの取得が可能)となると同様に配列に基づくアイデンティティの仕事を作るために

INSERT INTO my_entity (id, name) 
VALUES (hibernate_sequence.nextval, :p0) 
returning id into :nhIdOutParam 

:それはこのようなクエリを使用しようとします。私は外のparamが10進数として現れ、それが問題を抱えていると推測しています。

"ネイティブ"世代戦略に移行していますが、これについて他の洞察を聞きたいと思います。

関連する問題