删除时我几乎不知道如何继续。 我的问题是,如果某个类别与某个问题相关联,并且我尝试将其从项目中删除,我就不应该这样做。
我该怎么做?请帮助。
我有3个表,问题,项目,类别
关系如下: 1.项目可能有很多问题,问题只与一个项目有关 2.问题可能只有一个类别 3.项目可能有一个或多个类别
Issue.hbm.xml如下:
<id name="id" type="Int32" unsaved-value="0" access="field">
<column name="ID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Issue"/>
<generator class="native" />
</id>
<many-to-one name="Project" class="API.Project, API">
<column name="ProjectID" length="4" sql-type="int" not-null="false"/>
</many-to-one>
<many-to-one name="Category" class="API.Category, API">
<column name="CategoryID" length="4" sql-type="int" not-null="false"/>
</many-to-one>
project.hbm.xml
<id name="id" type="Int32" unsaved-value="0" access="field">
<column name="ID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Project"/>
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="Name" length="200" sql-type="varchar" not-null="true" unique="true" index="IX_Project_Name"/>
</property>
category.hbm.xml
<id name="id" type="Int32" unsaved-value="0" access="field">
<column name="ID" sql-type="int" not-null="true" unique="true" index="PK_Category"/>
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="Name" length="50" sql-type="varchar" not-null="true" unique="true" index="IX_Category"/>
</property>
<many-to-one name="Project" class="API.Project, API" >
<column name="ProjectID" length="4" sql-type="int" not-null="false"/>
</many-to-one>
答案 0 :(得分:1)
IMO,如果你不能做某事,那么这些课不应该允许它。
您没有提供课程代码。但是看起来,请确保在业务对象上只能进行有效的操作。使用NH,您使用的是ORM。您的应用程序的关键不是数据库,而是您的类模型。如果你没有真正使用面向对象的力量,你就无法获得NH的全部力量。
最有可能的是,封装是解决方案。
这就是说,数据库本身也应该始终提供一些最小的一致性检查。您可能应该使该类别的ProjectID不为null。 (有时NH会遇到非空约束的问题,例如当存在循环引用时。然后你需要删除它们。)
关闭主题:通常您不需要指定sql-types。它们由NH设置为有意义的默认值。并且:您不需要自己编写数据库模式(除非您在旧数据库中)。您可以使用(强烈推荐)ExportSchema类,该类根据您的映射文件编写模式。那么你不需要两次写相同的信息。
答案 1 :(得分:0)
我假设您的数据库中有引用ID的外键? (如果不是你应该这样做)。在这种情况下,映射中的foreign-key属性是必需的,并且当前它看起来像是缺少。
e.g。对于issue.hbm.xml,它可能看起来像这样:
<id name="id" type="Int32" unsaved-value="0" access="field">
<column name="ID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Issue"/>
<generator class="native" />
</id>
<many-to-one name="Project" class="API.Project, API" foreign-key="FK_Issue_Project">
<column name="ProjectID" length="4" sql-type="int" not-null="false"/>
</many-to-one>
<many-to-one name="Category" class="API.Category, API" foreign-key="FK_Issue_Category">
<column name="CategoryID" length="4" sql-type="int" not-null="false" />
</many-to-one>
我在这里放入的FK名称只是假设,请查看数据库中的内容以确保它们是正确的。
一旦NHibernate知道你的FK关系,它应该照顾其余部分:)
修改强>
OOPs - 外键属性应该是多对一元素,而不是列对不起。见修改后的代码。