0

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: 別のトランザクションによって行が更新または削除されました (または、保存されていない値のマッピングが正しくありませんでした)。

誰が私に何が起こっているのか説明できますか?

4

1 に答える 1

-1

割り当てられた ID を使用する場合、NHibernate は、ID を保存されていない値の設定と比較することにより、エンティティが永続的であるかどうかを判断できます。私の理解では、保存されていない値の設定により SaveOrUpdate を使用でき、参照したドキュメントは古くなっている/誤解を招くものです。

たとえば、id が int の場合、デフォルトの unsaved-value は 0 です。

5.1.4

unsaved-value (オプション - デフォルトは「適切な」値): インスタンスが新しくインスタンス化された (保存されていない) ことを示す識別子プロパティ値で、以前のセッションで保存またはロードされた一時的なインスタンスと区別されます。

于 2013-03-14T13:03:41.657 に答える