у меня есть класс сущностей, у которого есть сумка с дочерним классом сущностей, например, так (скопированы соответствующие строки):
<class name="Entity" table="Entities" lazy="false">
<id name="ID">
<generator class="guid"/>
</id>
<bag name="SubEntities" table="SubEntities" cascade="all-delete-orphan">
<key column="EntityID"/>
<one-to-many class="SubEntity"/>
</bag>
</class>
Теперь отображение работает хорошо и, как и ожидалось, в большинстве случаев (когда я удаляю / сохраняю его, каскадируется), но когда я пытаюсь удалить некоторую часть (дочерний элемент) из пакета в классе Entity (родительский) - изменение делает не каскад, и все, что я вижу в БД, это то, что внешний ключ подразделения был изменен на ноль и не удален, как мне бы хотелось.
Я читал что-то о том, что nhibernate не понимает, какую строку нужно удалить в базе данных (без уникального идентификатора для строки) - поэтому я попытался использовать idbag вместо bag - но idbag не позволяет в коллекции много-много, я пробовал что-то в этом роде:
<idbag name="SubEntities" table="SubEntities" cascade="all-delete-orphan">
<collection-id column="Id" type="Guid">
<generator class="guid"/>
</collection-id>
<key column="EntityID"/>
<one-to-many class="SubEntity"/>
</idbag>
, что, конечно, дает ошибку, что один-ко-многим там не разрешено.
Даже когда я пытаюсь использовать компонент (который я не хочу, поскольку я хочу, чтобы дочерний элемент также был сущностью) - я не могу использовать внешний файл hbm для его определения (сущность является довольно большим классом сама по себе)
поэтому установка свойства объекта в hbm-файлах родителя также не является хорошей идеей.
Может ли кто-нибудь помочь мне объяснить, что не так и как я должен это исправить? мне действительно нужно убрать эту дрянь!
Спасибо!
По запросу - я вставляю свои файлы hbm:
Для сущности:
<?xml version="1.0" encoding="utf-8" ?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Com.Project.Shared.Common" namespace="Com.Project.Shared.Common.Entities">
- <class name="Entity" table="Entities" lazy="false">
- <id name="ID">
<generator class="guid" />
</id>
<property name="Name" />
<property name="Description" />
<property name="EndTime" />
<property name="StartTime" />
<property name="State" />
<property name="Stored" />
<property name="ClassRoomID" />
<property name="Score" />
<many-to-one name="Network" class="Network" column="NetworkID" />
- <bag name="Scenarios" cascade="all">
<key column="EntityID" />
<one-to-many class="EntScenario" />
</bag>
- <bag name="TimeLineEvents" order-by="TimeStamp" cascade="all">
<key column="EntityID" />
<one-to-many class="TimeLineEvent" />
</bag>
- <bag name="SubEntity" table="SubEntities" cascade="all-delete-orphan">
<key column="EntityID" />
<one-to-many class="SubEntity" />
</bag>
</class>
</hibernate-mapping>
для субъекта:
<?xml version="1.0" encoding="utf-8" ?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Com.Project.Shared.Common" namespace="Com.Project.Shared.Common.Entities">
- <class name="SubEntity" table="SubEntities" lazy="false">
- <id name="ID">
<generator class="guid" />
</id>
<many-to-one name="Name" class="EntName" column="NameID" />
<many-to-one name="Station" class="EntStation" column="StationID" />
- <bag name="Performances" table="EntPerformances" cascade="all">
<key column="SubEntityID" />
- <composite-element class="Performance">
<property name="Rank" />
<property name="Remark" />
<many-to-one name="Category" class="PerformanceCategory" column="CategoryID" index="ListIndex" />
</composite-element>
</bag>
</class>
</hibernate-mapping>
Тестер, который я использую:
Entity newEntity = _dal.GetAll<Entity>()[0];
ObservableCollection<SubEntity> subEntities = newEntity.ObservableSubEntities;
subEntities .RemoveAt(1);
_dal.SaveItem<Entity>(newEntity);
Это просто превратило столбец EntityID в subentity в Null, но не удаляет его.
Я оцениваю вашу помощь, ребята.