NHibernate - 更新标识字段

时间:2009-06-21 18:29:25

标签: nhibernate

我们可以更新NHibernate中的Id字段,如下所示吗?

MyClass myObj = MyClass.Retrieve(1);

myObj.Id = 999;
myObj.Name = "name name";
myObj.Value = 1000;

MyClass.Update(myObj);

4 个答案:

答案 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);