2017-03-17 17 views
0

逆シリアル化されているオブジェクトをロックすると問題が発生します。NHibernate - 逆シリアル化オブジェクトのロック

例えば:

var session = sessionFactory.OpenSession(); 
var item = session.QueryOver<T>().Where(x => x.Id = "1").FutureValue().Value; 

var serializedObject = Serializer.Serialize(item); 

//do something with the serialized object 
//... 

var deserializedObject = Deserializer.Deserialze(serializedObject); 
//lock record 
session.Lock(deserializedObject, lockMode); 

エラー:

a different with the same identifier value was already associated with the session... 

しかし、開かれたセッションから同じのSessionId ISTエラーでのSessionId。

元の「アイテム」をロックすると機能します。

私はシリアル化/デシリアライゼーションとどのように対話できますか? NHibernateのは、まさにあなたのTの1つのインスタンスを追跡している事前に

おかげウント宜しくは

+1

...あなたはTの別のインスタンス(Deserialize' 'によって返されたもの)を使用しようとしています。デシリアライズされたオブジェクトを 'session.Merge'する必要があります(' session.Merge'は 'session'に付加された別のオブジェクトを返します)。 – xanatos

+0

こんにちはxanatos、あなたはそれを説明できますか?今私はsession.Merge(deserializedObject)を試してみる。しかし、エラーは同じです:( –

+0

'deserializedObject = session.Merge(deserializedObject)' – xanatos

答えて

1

...あなたはTの別のインスタンス(Deserializeによって返されたもの)を使用しようとしています。 deserializedObjectはNHibernateのを追跡しているオブジェクトで、この時点から

deserializedObject = session.Merge(deserializedObject); 

:あなたは(!そのsession.Merge戻りますが、その後、使用しなければならない別のオブジェクトと注意してください)例えば

session.Mergeに非直列化されたオブジェクトを持っています。

結果をsession.Mergeに割り当てるのを忘れないでください!

次の行はまったく役に立たず、よくあるエラーです! NHibernateのは、まさにあなたのTの1つのインスタンスを追跡している

session.Merge(deserializedObject); 
関連する問題