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:行已被另一个事务更新或删除(或未保存的值映射不正确)。
任何人都可以向我解释发生了什么事吗?
答案 0 :(得分:-1)
当使用指定的ID时,NHibernate可以通过将id与未保存的值设置进行比较来确定实体是否是持久的。我的理解是,未保存的值设置允许使用SaveOrUpdate,并且您引用的文档已过时/误导。
例如,如果您的id为int,则默认的unsaved-value为0。
unsaved-value(可选 - 默认为“合理”值):An 标识符属性值,指示实例是新的 实例化(未保存),将其与瞬态实例区分开来 在之前的会话中保存或加载的内容。