手動で生成されたIDでエンティティを永続化しようとすると、NHibernate(v3.3)で奇妙なエラーが発生します。
識別子{Id}が割り当てられた{Entity}が一時的であるか切り離されているかを判別できません。データベースのクエリ。これを防ぐには、セッションで明示的なSave()またはUpdate()を使用してください。
しかし、問題は、の代わりに使用していることです。何が問題なのですか?Save
SaveOrUpdate
手動で生成されたIDでエンティティを永続化しようとすると、NHibernate(v3.3)で奇妙なエラーが発生します。
識別子{Id}が割り当てられた{Entity}が一時的であるか切り離されているかを判別できません。データベースのクエリ。これを防ぐには、セッションで明示的なSave()またはUpdate()を使用してください。
しかし、問題は、の代わりに使用していることです。何が問題なのですか?Save
SaveOrUpdate
私の問題は、1対多の関係にある子エンティティを含む親エンティティを保存しているときに実際に発生していたことが判明しました。
<class xmlns="urn:nhibernate-mapping-2.2" name="ParentTable" table="ParentTable">
<id name="ManuallyAssignedId">
<generator class="assigned" />
</id>
<!- child table also has a manually assigned id -->
<bag cascade="all" inverse="true" name="ChildTable">
<key>
<column name="ParentTable_id"/>
</key>
<one-to-many class="ChildTable" />
</bag>
</class>
言い換えるとSave
、親エンティティへの呼び出しはSaveOrUpdate
、NHibernateが不平を言っていた子エンティティへの呼び出しを引き起こしました。
私が気付いたとき、私はすぐにこのStackOverflowスレッドを見つけました:割り当てられたIDを持つ子をnhibernateに保存する方法。これには2つの素晴らしい提案があります。
バージョンまたはタイムスタンプ列を作成してマップします-それがnullの場合、NHibernateはエンティティを永続化する必要があることを認識します。
カスタムインターセプターをセッション(またはセッションファクトリ)にアタッチし、カスタムプライベートフィールドを使用して、エンティティを永続化する必要があるかどうかを追跡します。