2017-03-17 13 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。

如果我锁定原来的“项目”,那么它的作品。

现在是我的问题我该如何与序列化/反序列化交互?

预先感谢UND最诚挚的问候

+1

NHibernate跟踪你的T的一个实例...你试图使用T的另一个实例('Deserialize'返回的那个实例)。你必须'session.Merge'反序列化的对象(并注意'session.Merge'返回另一个对象!附加到'session'的对象)。 – xanatos

+0

你好xanatos,请你解释一下。现在我尝试session.Merge(deserializedObject);但错误是一样的:( –

+0

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

回答

1

NHibernate的是跟踪你的T的只有一个实例...你要使用的T另一个实例(一个由Deserialize返回)。你必须session.Merge反序列化对象(请注意,session.Merge返回另一个对象,则必须使用!)

例如:

deserializedObject = session.Merge(deserializedObject); 

从这点上来说,该deserializedObject是对象NHibernate的被跟踪。

记得分配session.Merge的结果!

下一行完全没用,是一个常见错误!

session.Merge(deserializedObject);