8

IListとしていくつかのプロパティに新しいオブジェクトのコレクションを含む新しいオブジェクトがあります。SQLプロファイラーを通して2つの挿入クエリが実行されていることがわかります。1つは新しいGUIDIDを持つ親用で、もう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を受け入れると切断が発生したため、子を「再アタッチ」するための奇妙なコードを考え出す必要がありました。

4

2 に答える 2

9

マッピング クラスに NOT-NULL="true" を追加する必要がある場合があります。

<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"/>

親子関係のある現在のプロジェクトで休止状態に同様の問題がありましたが、これは解決策の一部でした。

于 2008-09-28T20:20:44.037 に答える
0

私はこの問題を抱えていて、理解するのに永遠にかかりました。子テーブルは、親の外部キーで null を許可する必要があります。NHibernate は、子を外部キー列に NULL で保存してから、戻って正しい ParentId で更新することを好みます。

于 2010-11-17T14:25:00.000 に答える