2010-04-14 192 views
0

我的數據庫是由我的NHibernate映射文件驅動的。NHibernate映射問題

我有一個範疇類,如下所示:

public class Category { 

     public Category() : this("") { } 

     public Category(string name) { 
      Name = name; 
      SubCategories = new List<Category>(); 
      Products = new HashSet<Product>(); 
     } 


     public virtual int ID { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string Description { get; set; } 
     public virtual Category Parent { get; set; } 
     public virtual bool IsDefault { get; set; } 
     public virtual ICollection<Category> SubCategories { get; set; } 
     public virtual ICollection<Product> Products { get; set; } 

,這裏是我的映射文件:

<property name="Name" column="Name" type="string" not-null="true"/> 
<property name="IsDefault" column="IsDefault" type="boolean" not-null="true" /> 
<property name="Description" column="Description" type="string" not-null="true" /> 

<many-to-one name="Parent" column="ParentID"></many-to-one> 

<bag name="SubCategories" inverse="true"> 
    <key column="ParentID"></key> 
    <one-to-many class="Category"/> 
</bag> 
<set name="Products" table="Categories_Products"> 
    <key column="CategoryId"></key> 
    <many-to-many column="ProductId" class="Product"></many-to-many> 
</set> 

,當我嘗試創建我得到以下錯誤數據庫:

失敗:INSERT語句衝突與外鍵相同的表約束「FK9AD976763BF05E2A」。數據庫「CoderForTraders」,表「dbo.Categories」,列'CategoryId'發生衝突。 該聲明已被終止。

我在網上看了一些答案,但沒有發現。 感謝您的幫助

這裏是缺少的部分:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CBL.CoderForTraders.DomainModel" namespace="CBL.CoderForTraders.DomainModel" default-access="field.camelcase-underscore" default-lazy="true"> 

    <class name="Category" table="Categories" > 
    <id name="_persistenceId" column="CategoryId" type="Guid" access="field" unsaved-value="00000000-0000-0000-0000-000000000000"> 
     <generator class="assigned" /> 
    </id> 
    <version name="_persistenceVersion" column="RowVersion" access="field" type="int" unsaved-value="0" /> 

回答

1

錯誤發生在插入,而不是表創建。您不顯示ID的映射,但如果它是SQL Server中的標識列,則不可能插入第一條記錄,因爲父記錄(Category屬性)不存在。一種解決方案可能是臨時刪除約束,插入引用自身的「根」記錄,然後添加約束。

+0

這對我來說很有意義。我會馬上嘗試! – 2010-04-14 23:11:07

+0

你知道嗎。那樣做了。許多非常感謝傑米 – 2010-04-14 23:16:27

+0

完全有意義。看不到它。 – zoidbeck 2010-04-15 22:38:29

0

我認爲問題是,你必須提供一個明確的FK-約束名稱,以避免命名colision:

<bag name="SubCategories"> 
    <key column="ParentID" foreign-key="fk_Category_ParentCategory"/> 
    <one-to-many class="Category"/> 
</bag> 

Here你可以找到一個關於如何在NHibernate中映射樹的好教程。既然它也使用模式生成,它應該可以解決你的問題。

+0

不幸的是,我仍然得到相同的錯誤 – 2010-04-14 22:33:40

+0

你有沒有嘗試沒有inverse =「true」?對不起,現在需要一些睡眠。 – zoidbeck 2010-04-14 22:47:17

+0

是同樣的結果。 Thks for your help – 2010-04-14 22:56:55