У меня есть класс консигнации, который агрегирует класс FreightDateTime. В то же время класс FreightDateTime также агрегируется классом GoodsItem. Точно так же FreightDateTime связан с рядом других классов, которые я пока оставил.
Чтобы избежать создания базы данных FreightDateTime с внешним ключом ConsignmentId, внешним ключом GoodsItemId и т. Д. Я решил, что ассоциация должна быть «многие ко многим». Таким образом, 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.
Установка каскада в "none" приводит к:
NHibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Logistics.FreightDateTime
В обоих случаях это означает, что NHibernate пытается сохранить экземпляр консигнации, хотя дочерние экземпляры FreightDateTime не были сохранены. В первом случае внешний ключ все еще имеет значение «ноль», что, таким образом, не может быть вставлено в результирующую таблицу, а во втором случае NHibernate осознает, что экземпляр еще не сохранен, и, таким образом, выдает исключение.
Таким образом, вопрос в том, как мне заставить NHibernate сначала сохранить все дочерние экземпляры без явного указания сделать это. У меня есть предчувствие, что пустые значения в столбце DateTimeId помогут, но я думаю, что это не желательно и не возможно.