nhibernate和所有删除孤立项

nhibernate和所有删除孤立项,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个实体类,它有一个像这样的子实体类包(复制了相关行): 现在,在大多数情况下(当我删除/保存它级联时),映射工作得很好,正如预期的那样,但是当我尝试从Entity(parent)类的包中删除某些子实体(子实体)时,更改不会级联,我在DB中看到的只是子实体的外键被更改为null,而不是像我所希望的那样删除 我读过一些关于nhibernate的文章,没有意识到它需要在数据库中删除哪一行(行没有唯一的id)-因此我尝试使用idbag而不是bag-但是idbag不允许在其中进行一对多的收集,我

我有一个实体类,它有一个像这样的子实体类包(复制了相关行):


现在,在大多数情况下(当我删除/保存它级联时),映射工作得很好,正如预期的那样,但是当我尝试从Entity(parent)类的包中删除某些子实体(子实体)时,更改不会级联,我在DB中看到的只是子实体的外键被更改为null,而不是像我所希望的那样删除

我读过一些关于nhibernate的文章,没有意识到它需要在数据库中删除哪一行(行没有唯一的id)-因此我尝试使用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="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);
Entity newEntity=_dal.GetAll()[0];
ObservableCollection子实体=newEntity.ObservableSubEntities;
子实体。移除(1);
_dal.保存项(新实体);
这只是将子实体中的EntityID列变成了Null,但没有删除它


伙计们,我很感谢你们的帮助。

如果你们想让
包像预期的那样工作,它需要有
inverse=“true”


这告诉NHibernate,
实体
负责管理关系(并且您可以使FK列非空)

如果我将所有者(反向)设置为子实体,这意味着当我插入实体(及其子实体的集合)时,子实体不会遵循FK约束(基本上,如果我得到实体本身-它的子实体也不会被获取)。这不是我想要的。我添加了一个示例(请参阅)-它使用FluentNHibernate,但它为您吐出了.hbm.xml文件。您可以使用NEWID()添加一个ID列作为主键吗默认值?请发布子实体类的*.hbm.xml?…和一小段代码,说明如何删除对象?类似于
entity.Remove(child);session.Update(entity);session.Flush();
。谢谢。我已经添加了你们想要的所有内容。
  <?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);