NHibernate标识插入

NHibernate标识插入,nhibernate,Nhibernate,我已经到处找了,找不到一个很好的答案来解决NHibernate的这个问题 我正在使用一个使用NHibernate的API。我正在进行数据传输,并试图使用他们的用户对象来保存用户数据 我创建对象 User objUser = new User(); 它们有一个映射文件,指定要设置为标识的ID <id name="Id" column="UserId" type="int"> <generator class="native" /> </id> 但是当以后

我已经到处找了,找不到一个很好的答案来解决NHibernate的这个问题

我正在使用一个使用NHibernate的API。我正在进行数据传输,并试图使用他们的用户对象来保存用户数据

我创建对象

User objUser = new User();
它们有一个映射文件,指定要设置为标识的ID

<id name="Id" column="UserId" type="int">
  <generator class="native" />
</id>
但是当以后像这样再次尝试保存用户对象时

 using (ISession session = MyDatabaseFactory.SessionFactory.OpenSession())
{
    using (ITransaction trans = session.BeginTransaction())
    {
       session.CreateSQLQuery("SET IDENTITY_INSERT Users  ON").UniqueResult();
       session.Save(objUser, objUser.Id);
       session.Flush();

       trans.Commit();

       session.CreateSQLQuery("SET IDENTITY_INSERT Users OFF").UniqueResult();

       session.Close();
       objUser= session1.Merge(objUser);
       }
 }
objUser.Passwords.Add("password1");
                    objUser.Save()
我收到一个错误:具有相同标识符值的不同对象已与会话关联

Save()
尝试将新对象插入数据库。 您应该尝试使用
Update()
,它更新数据库中的现有记录以获取持久对象。 您还可以使用
SaveOrUpdate()
,它决定使用上面哪一项

通过再次调用
Save()
,我认为它试图插入另一条具有相同Id的记录。
有更多详细信息。

如果您的要求仅用于非常特殊的情况,例如数据库更新或迁移,您可能会使用不同的会话工厂,其中ID为assignd:

<id name="Id" column="UserId" type="int">
  <generator class="assigned" />
</id>

如果您的案例与正常业务案例紧密集成,那么这不是一个很好的解决方案


您可以尝试实现自己的
IIdentifierGenerator
。不要期望它简单明了。您可能有机会派生
IdentityGenerator
,合并
分配的
生成器中的一些代码,并将此
设置标识\u将用户插入到
生成器中。。。生成器需要知道何时使用哪种策略。例如,当id仍然为0时,让SQL Server创建一个,当它是其他内容时,插入分配的值。

这看起来像是标识种子小于当前标识的情况。i、 e种子为0,下一个Id为1,但您已插入1,但未将种子设置为1。
User objUser = new User() { UserId = 42 };