我们可以更新NHibernate中的Id字段,如下所示吗?
MyClass myObj = MyClass.Retrieve(1);
myObj.Id = 999;
myObj.Name = "name name";
myObj.Value = 1000;
MyClass.Update(myObj);
答案 0 :(得分:4)
您永远不应更改现有对象上的标识符(主键)。对于NHibernate,如果已将generator映射为“已分配”,则应仅在新对象上分配标识符。如果您打算克隆现有对象,则检索该对象并将克隆创建为新实例,以便分配新标识符。
答案 1 :(得分:2)
这样的事情会起作用:
ISession.Delete(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);
您为什么要更改标识符? 这听起来是件坏事。
答案 2 :(得分:2)
您可以关闭会话,执行原始sql以更改主键,然后打开新会话。这是唯一可行的,因为nhibername依赖于主键身份。 永远不会能够让nhibernate做到这一点。
答案 3 :(得分:1)
我必须在删除之后添加Evict
然后工作。
这样的事情会起作用:
ISession.Delete(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);
您为什么要更改标识符?这听起来是件坏事。
这就是我所做的:
ISession.Delete(yourClass);
ISession.Evict(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);