NHibernate のドキュメントには具体的に次のように書かれています
5.1.4.7. 割り当てられた識別子
(NHibernate に識別子を生成させるのではなく) アプリケーションに識別子を割り当てさせたい場合は、割り当てられたジェネレータを使用できます。この特別なジェネレーターは、オブジェクトの identifier プロパティに既に割り当てられている識別子の値を使用します。この機能を使用してビジネス上の意味を持つキーを割り当てる場合は、十分に注意してください (ほとんどの場合、ひどい設計上の決定です)。
その固有の性質により、このジェネレーターを使用するエンティティは、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: 別のトランザクションによって行が更新または削除されました (または、保存されていない値のマッピングが正しくありませんでした)。
誰が私に何が起こっているのか説明できますか?