我有一个实体类,它有一包子实体类,如此复制(复制相关行):
<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 - 但不会将其删除。
我帮助你了,伙计们。
答案 0 :(得分:1)
bag
如果您希望它按预期工作,则需要inverse="true"
。
这告诉NHibernate Entity
负责管理关系(并且你将能够使你的FK列非空)