NHibernateバッグコレクションが子の「親ID」を動的に設定しないのはなぜですか?
-
02-07-2019 - |
質問
IListとしてのプロパティに新しいオブジェクトのコレクションを持つ新しいオブジェクトがあります。 sqlプロファイラーを通して、2つの挿入クエリが実行されています。1つは新しいGUID IDを持つ親用、もう1つは子用ですが、親を参照する子の外部キーは空のGUIDです。親のマッピングは次のとおりです。
<id name="BackerId">
<generator class="guid" />
</id>
<property name="Name" />
<property name="PostCardSizeId" />
<property name="ItemNumber" />
<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority">
<key column="BackerId" />
<one-to-many class="BackerEntry" />
</bag>
Backer.csクラスで、BackerEntriesプロパティを
として定義しましたIList<BackerEntry>
渡されたエンティティをSaveOrUpdateしようとすると、SQLプロファイラーで次の結果が得られます。
exec sp_executesql N'INSERT INTO Backer(Name、PostCardSizeId、ItemNumber、BackerId)VALUES(@ p0、@ p1、@ p2、@ p3) '、N' @ p0 nvarchar(3)、@ p1 uniqueidentifier、@ p2 nvarchar(3)、@ p3 uniqueidentifier '、@ p0 = N'qaa'、@ p1 = 'BC95E7EB-5EE8-44B2-82FF30F5176684D'、@ p2 = N'qaa '、@ p3 =' 18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5 '
exec sp_executesql N'INSERT INTO BackerEntry(BackerId、BackerEntryTypeId、Name、Description、MaxLength、IsRequired、Priority、BackerEntryId)VALUES(@ p0、@ p1、@ p2、@ p3、@ p4、@ p5、@ p6、 @ p7) '、N' @ p0 uniqueidentifier、@ p1 uniqueidentifier、@ p2 nvarchar(5)、@ p3 nvarchar(5)、@ p4 int、@ p5 bit、@ p6 int、@ p7 uniqueidentifier '、@ p0 =' 00000000-0000-0000-0000-000000000000 '、@ p1 =' 2C5BDD33-5DD3-42EC-AA0E-F1E548A5F6E4 '、@ p2 = N'qaadf'、@ p3 = N'wasdf '、@ p4 = 0、@ p5 = 1、@ p6 = 0、@ p7 = 'FE9C4A35-6211-4E17-A75A-60CCB526F1CA'
ご覧のとおり、子のBackerIdの空のGUIDを親の新しい実際のGUIDにリセットしません。
最後に、例外のスローは次のとおりです:
"NHibernate.Exceptions.GenericADOException: could not insert: [CB.ThePostcardCompany.MiddleTier.BackerEntry][SQL: INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Description, MaxLength, IsRequired, Priority, BackerEntryId) VALUES (?, ?, ?, ?, ?, ?, ?, ?)] ---\u003e System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint
編集:解決済み!以下の最初の答えは、正しい方向を示してくれました。子マッピングとクラスにその後方参照を追加する必要がありました。これにより、純粋に.netの方法で動作することができましたが、jsonを受け入れるときに切断があったため、子を「再接続」するための風変わりなコードを考え出す必要がありました。
解決
NOT-NULL =&quot; true&quot;を追加する必要がある場合がありますマッピングクラス:
<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority">
<key column="BackerId" not-null="true"/>
<one-to-many class="BackerEntry" />
</bag>
同様に、子クラスに対して定義されたマッピングの逆があることを確認してください:
<many-to-one name="parent" column="PARENT_ID" not-null="true"/>
親子関係を持つ現在のプロジェクトで、休止状態に関して同様の問題が発生しましたが、これはソリューションの一部でした。
他のヒント
私はこの問題を抱えていたため、理解するのに永遠に時間がかかりました。 Childテーブルは、その親外部キーでnullを許可する必要があります。 NHibernateは、外部キー列にNULLを持つ子を保存してから、戻って正しいParentIdで更新することを好みます。