nhibernate и All-delete-orphan - PullRequest
       2

nhibernate и All-delete-orphan

0 голосов
/ 20 декабря 2011

у меня есть класс сущностей, у которого есть сумка с дочерним классом сущностей, например, так (скопированы соответствующие строки):

<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, но не удаляет его.

Я оцениваю вашу помощь, ребята.

1 Ответ

1 голос
/ 20 декабря 2011

bag должен иметь inverse="true", если вы хотите, чтобы он работал как положено.

Это говорит NHibernate, что Entity отвечает за управление отношениями (и вы сможете сделать свой столбец FK ненулевым)

...