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

时间:2013-03-13 23:27:14

标签: nhibernate fluent-nhibernate identifier

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();
 }

我在做的时候会发生错误:

 Product myProduct = new Product(presetID);
 session.SaveOrUpdate(myProduct);
 transaction.Commit();

但没有任何反应。

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

任何人都可以向我解释发生了什么事吗?

1 个答案:

答案 0 :(得分:-1)

当使用指定的ID时,NHibernate可以通过将id与未保存的值设置进行比较来确定实体是否是持久的。我的理解是,未保存的值设置允许使用SaveOrUpdate,并且您引用的文档已过时/误导。

例如,如果您的id为int,则默认的unsaved-value为0。

5.1.4

  

unsaved-value(可选 - 默认为“合理”值):An   标识符属性值,指示实例是新的   实例化(未保存),将其与瞬态实例区分开来   在之前的会话中保存或加载的内容。