NHibernate SaveOrUpdate()使用GeneratedBy.Assigned()时不正确

NHibernate SaveOrUpdate()使用GeneratedBy.Assigned()时不正确,nhibernate,fluent-nhibernate,identifier,Nhibernate,Fluent Nhibernate,Identifier,NHibernate的文件特别指出 5.1.4.7。指定标识符 如果希望应用程序分配标识符(而不是让NHibernate生成标识符),可以使用分配的生成器。此特殊生成器将使用已分配给对象标识符属性的标识符值。使用此功能分配具有业务意义的键时要非常小心(几乎总是一个糟糕的设计决策) 由于其固有特性,无法通过ISession的SaveOrUpdate()方法保存使用此生成器的实体。相反,您必须通过调用ISession的Save()或Update()方法显式地指定NHibernate是否保存或更新对象

NHibernate的文件特别指出

5.1.4.7。指定标识符

如果希望应用程序分配标识符(而不是让NHibernate生成标识符),可以使用分配的生成器。此特殊生成器将使用已分配给对象标识符属性的标识符值。使用此功能分配具有业务意义的键时要非常小心(几乎总是一个糟糕的设计决策)

由于其固有特性,无法通过ISession的SaveOrUpdate()方法保存使用此生成器的实体。相反,您必须通过调用ISession的Save()或Update()方法显式地指定NHibernate是否保存或更新对象

但我使用的是分配的标识符和session.SaveOrUpdate(),没有收到任何类型的错误/警告

我错过了什么?他们是否改变了SaveOrUpdate的行为,现在它可以与指定的标识符一起使用

我也在使用Fluent NHibernate的自动映射

代码如下:

 public class MyIDConvention : IIdConvention
 {
      public void Apply(IIdentityInstance instance)
        {
            instance.GeneratedBy.Assigned();
        }
 }
 
 private static ISessionFactory CreateSessionFactory()
 {
      return Fluently.Configure().Database(SQLiteConfiguration.Standard.UsingFile("testDB.db"))
      .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Product>(cfg).Conventions.Add<MyIDConvention>()
      .BuildSessionFactory();
 }
但什么也没发生

如果我遗漏了myIDConvention,那么我会得到错误: NHibernate.StaleObjectStateException:行被另一个事务更新或删除(或者未保存的值映射不正确)


有人能给我解释一下发生了什么吗?

当使用分配的id时,NHibernate可以通过比较id和未保存的值设置来确定实体是否持久。我的理解是,未保存的值设置允许使用SaveOrUpdate,并且您引用的文档已过时/具有误导性

例如,如果id为int,则默认的未保存值为0

未保存值(可选-默认为“合理”值):一个 标识符属性值,指示实例是新创建的 实例化(未保存),将其与瞬态实例区分开来 在上一个会话中保存或加载的


假设我的id为int类型,未保存的值为0,假设我的预设id为5,这将向NHibernate暗示我的产品(id为5)是一个更新。但是,我没有更新,我正在保存,因为我刚刚创建了对象并将其插入数据库。它是怎么知道的?另外,作为旁注,我引用的第5.1.4.7节是同一文件第5.1.4节的第7小节……你是对的,我是错的(大部分)。在重新阅读我的观点后,我认为对于分配的ID,SaveOrUpdate只是被忽略,不会引发异常。但是,我认为未保存的值设置会导致在不显式调用Update的情况下更新持久对象(但我没有对此进行测试)。
 Product myProduct = new Product(presetID);
 session.SaveOrUpdate(myProduct);
 transaction.Commit();