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