不知道如何在NHibernate中继续删除

时间:2010-08-06 08:16:38

标签: nhibernate

删除时我几乎不知道如何继续。 我的问题是,如果某个类别与某个问题相关联,并且我尝试将其从项目中删除,我就不应该这样做。

我该怎么做?请帮助。

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

2 个答案:

答案 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 - 外键属性应该是多对一元素,而不是列对不起。见修改后的代码。