0
votes

i have a an entity class which has a bag of child entity class like so(copied relevant lines):

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

Now, the mapping works well and as expected in most cases (when i delete/save it cascades), but when i try to remove some subentity(child) from the bag in the Entity(parent) class - the change does not cascade and all i see in the DB is that the subentitiy's foreign key was changed to null, and not deleted as i would like.

I've read something about nhibernate not realizing which line it needs to delete in the database (no unique id for the row) - so i tried to use the idbag instead of the bag - but the idbag does not allow a one-to-many collection in it, i've tried something of the sort:

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

which of course gives the error that one-to-many isnt allowed there.

Even when i try to use the component (which i dont want as i want the child is also an entity) - i cant use an external hbm file to define it (the subentity is a rather large class by itself) so setting the entity's propertise in the parent's hbm files isnt a good idea as well.

Could anyone help me out with explaning whats wrong and how am i supposed to fix it? i really need the subentity to be removed!

Thanks!


As requested - I"m pasting my hbm files:

For Entity:

 <?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>

for SubEntity:

  <?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>

The tester i use is:

Entity newEntity = _dal.GetAll<Entity>()[0];
            ObservableCollection<SubEntity> subEntities = newEntity.ObservableSubEntities;
            subEntities .RemoveAt(1);
            _dal.SaveItem<Entity>(newEntity);

This just turned the EntityID column in subentity into Null - but doesnt delete it.

I appericiate your help, guys.

1
Can you add an ID column as primary key with NEWID() default value?Mr Mush
Could you please post the *.hbm.xml for the SubEntity class?Daniel Schilling
... and a small snippet of code that illustrates how you are trying to delete the object? Something like entity.Remove(child); session.Update(entity); session.Flush();. Thanks.Daniel Schilling
i've added all you guys wanted.Menyh

1 Answers

1
votes

The bag needs to have inverse="true" on it if you want it to work as expected.

This tells NHibernate that Entity is responsible to managing the relationship (and you'll be able to make your FK column non-null)