2010-08-06 65 views
3

我几乎不知道如何在删除时继续。 我的问题是,如果一个类别与某个问题相关联,并且我尝试从项目中删除它,那么我不应该这样做。不知道如何在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> 

回答

0

我假设在你的数据库,你有被引用的ID的外键? (如果不是,你应该这样做)。在这种情况下,您的映射中的外键属性是必需的,目前看起来它缺少。

例如对于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关系应采取休息:)照顾

编辑:

糟糕 - 外键属性应该是多到一个元件中的不专栏抱歉。见修改后的代码。

+0

嗨感谢您的回复。我有错误消息:{“API.NHibernate.Issue.hbm.xml(9,75):XML验证错误:'外键'属性没有声明。”} 在我的数据库中,我可以看到以下是外键关系: FK_Issue_Category,FK_Issue_Project和我根据您的示例进行了更改。 – learning 2010-08-10 09:44:38

+0

已编辑代码,看看,让我知道它是怎么回事:) – Scozzard 2010-08-10 21:52:15

1

国际海事组织,如果你不应该能够做某些事情,这些班级不应该允许它。

你没有提供你的类的代码。但是,看起来像,确保只有有效的操作可能在业务对象上。使用NH,您正在使用ORM。你的应用程序的关键不是数据库,而是你的类模型。如果你没有真正使用面向对象的力量,那么你不会得到NH的全部力量。

很可能,封装是这里的解决方案。

这就是说,数据库本身也应该总是提供一些最小一致性检查。您应该可能使该类别的ProjectID不为null。 (有时NH会得到非空约束的问题,例如有循环引用时,那么你需要删除它们)。

偏题:通常你不需要指定sql-types。它们由NH设置为有意义的默认值。并且:您不需要自己编写数据库模式(除非您在传统数据库中)。您可以使用(强烈推荐的)根据映射文件编写架构的ExportSchema类。那么你不需要两次写同样的信息。

相关问题