2010-08-06 68 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類。那麼你不需要兩次寫同樣的信息。

相關問題