nhibernate和All-delete-orphan

时间:2011-12-20 17:12:45

标签: nhibernate nhibernate-mapping

我有一个实体类,它有一包子实体类,如此复制(复制相关行):

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

现在,在大多数情况下(当我删除/保存级联时),映射效果很好,但是当我尝试从实体(父)类中的包中删除一些子实体(子)时 - 更改确实不是级联,我在数据库中看到的是subentitiy的外键被改为null,而不是像我想的那样删除。

我读过一些关于nhibernate没有意识到它需要在数据库中删除哪一行(没有该行的唯一ID) - 所以我试图使用idbag代替包 - 但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>

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

我使用的测试人员是:

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

这只是将subentity中的EntityID列变为Null - 但不会将其删除。

我帮助你了,伙计们。

1 个答案:

答案 0 :(得分:1)

bag如果您希望它按预期工作,则需要inverse="true"

这告诉NHibernate Entity负责管理关系(并且你将能够使你的FK列非空)