NHibernate-更新标识字段

NHibernate-更新标识字段,nhibernate,Nhibernate,我们可以像下面这样更新NHibernate中的Id字段吗 MyClass myObj = MyClass.Retrieve(1); myObj.Id = 999; myObj.Name = "name name"; myObj.Value = 1000; MyClass.Update(myObj); 类似这样的方法会奏效: ISession.Delete(yourClass); yourClass.Id = somethingelse; ISession.Save(yourClass);

我们可以像下面这样更新NHibernate中的Id字段吗

MyClass myObj = MyClass.Retrieve(1);

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

MyClass.Update(myObj);

类似这样的方法会奏效:

ISession.Delete(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);
    ISession.Delete(yourClass);
    yourClass.Id = somethingelse;
    ISession.Save(yourClass);
为什么要更改标识符?
这听起来是一件非常糟糕的事情。

像这样的事情会奏效:

ISession.Delete(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);
    ISession.Delete(yourClass);
    yourClass.Id = somethingelse;
    ISession.Save(yourClass);
为什么要更改标识符?
这听起来是一件非常糟糕的事情。

您不应该更改现有对象上的标识符(主键)。使用NHibernate,如果已将标识符映射为“已分配”,则只应在新对象上分配标识符。如果要克隆现有对象,请检索该对象并将克隆创建为新实例,以便分配新标识符。

决不能更改现有对象上的标识符(主键)。使用NHibernate,如果已将标识符映射为“已分配”,则只应在新对象上分配标识符。如果要克隆现有对象,请检索该对象并将克隆创建为新实例,以便分配新标识符。

您可以关闭会话,执行原始sql更改主键,然后打开新会话。这是nhibername依赖于主键标识的唯一功能。您永远无法让nhibernate执行此操作。

您可以关闭会话,执行原始sql更改主键,然后打开新会话。这是nhibername依赖于主键标识的唯一功能。你永远无法让nhibernate做这件事。

我必须在删除后添加一个
逐出
,然后才能工作


类似这样的方法会奏效:

ISession.Delete(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);
    ISession.Delete(yourClass);
    yourClass.Id = somethingelse;
    ISession.Save(yourClass);
为什么要更改标识符?这听起来是一件非常糟糕的事情

这就是我所做的:

ISession.Delete(yourClass);
ISession.Evict(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);

我必须在删除后添加一个
收回
,然后再工作


类似这样的方法会奏效:

ISession.Delete(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);
    ISession.Delete(yourClass);
    yourClass.Id = somethingelse;
    ISession.Save(yourClass);
为什么要更改标识符?这听起来是一件非常糟糕的事情

这就是我所做的:

ISession.Delete(yourClass);
ISession.Evict(yourClass);
yourClass.Id = somethingelse;
ISession.Save(yourClass);

首先,我同意-更改标识符一开始是个坏主意。但您的“解决方案”也不起作用,如果该实体已被其他实体引用-如果您具有引用完整性,您通常不能简单地从表中删除一行并重新创建它…..这是真的,您首先必须创建整个聚合根的深度副本,我同意——首先更改标识符是个坏主意。但是,您的“解决方案”在这里也不起作用,如果该实体已被其他实体引用-如果您具有引用完整性,您通常不能简单地从表中删除一行并重新创建它…这是真的,您必须创建整个聚合根的深度副本为什么不呢?更改主键是个糟糕的主意。我猜最初的问题是关于克隆过程。为什么不呢?更改主键是个糟糕的主意。我猜最初的问题是关于克隆过程的。