FreightDateTime クラスを集約する委託クラスがあります。同時に、FreightDateTime クラスも GoodsItem クラスによって集約されます。同様に、FreightDateTime は、ここでは省略した他の多くのクラスに関連付けられています。
ConsignmentId 外部キー、GoodsItemId 外部キーなどを使用したデータベース テーブル FreightDateTime を回避するために、関連付けは多対多にする必要があると判断しました。このように、NHibernate は代わりに各関係 (ConsigmentFreightDateTimes、GoodsItemFreightDateTimes) の関連付けテーブルを生成します。これはより理にかなっています。
したがって、マッピング ファイルでは、関連付けは次のようになります。
<bag name="DateTimes" table="FreightDateTimes" lazy="false" cascade="all">
<key column="ConsignmentId"/>
<many-to-many class="Logistics.FreightDateTime, Logistics" column="DateTimeId" />
</bag>
カスケードを「すべて」に設定すると、次のようになります。
System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'DateTimeId', table 'LogiGate.dbo.FreightDateTimes'; column does not allow nulls. INSERT fails.
カスケードを「なし」に設定すると、次の結果が得られます。
NHibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Logistics.FreightDateTime
どちらの場合も、子の FreightDateTime インスタンスは保存されていませんが、NHibernate が Consignment インスタンスを保存しようとしていることを意味します。最初のケースでは、外部キーはまだ 'null' であるため、結果のテーブルに挿入できません。2 番目のケースでは、NHibernate はインスタンスがまだ保存されていないことを認識しているため、例外をスローします。
問題は、明示的にそうするように指示せずに、最初にすべての子インスタンスを NHibernate に保存させる方法です。列 DateTimeId で null を許可するとうまくいくと思いますが、それは望ましくも可能でもないと思います。