2011-04-25 52 views
0

我在這裏很難過......我有我認爲是一個非常簡單的集合,我使用FluentNHibernate的HasMany函數進行映射,並且所有孩子的顯式設置屬性都保存,外鍵值不是。這裏是我的類和映射(除去多餘的數據):FluentNHibernate HasMany不持久外鍵

Public Class OrderForm 
    Private _sections As ICollection(Of OrderSection) 

    Public Sub New() 
     _sections = New List(Of OrderSection) 
    End Sub 

    Public Overridable Property Id As Integer 

    Public Overridable ReadOnly Property Sections As ICollection(Of OrderSection) 
     Get 
      Return _sections 
     End Get 
    End Property 
End Class 

Public Class OrderSection 
    Public Overridable Property Id As Integer 
    Public Overridable Property Name As String 
End Class 

我的映射是這樣的:

Public Class OrderFormMapping 
    Inherits ClassMap(Of OrderForm) 

    Public Sub New() 
     Table("Forms_OrderForm") 
     Id(Function(x) x.Id).GeneratedBy.HiLo("hibernate_unique_key", "Forms_OrderForm", 1000) 

     HasMany(Function(x) x.Sections).KeyColumn("OrderFormId").Access.CamelCaseField(Prefix.Underscore).Cascade.AllDeleteOrphan() 
    End Sub 
End Class 

Public Class OrderSectionMapping 
    Inherits ClassMap(Of OrderSection) 

    Public Sub New() 
     Table("Forms_OrderForm_Sections") 
     Id(Function(x) x.Id).GeneratedBy.HiLo("hibernate_unique_key", "Forms_OrderForm_Sections", 1000) 

     Map(Function(x) x.Name) 
    End Sub 
End Class 

在Forms_OrderForm_Sections的外鍵允許空值,因爲我知道,NHibernate的喜歡創造行,然後再設置外鍵。

事情是,我有另一個項目,使用,我可以告訴,相同的集合定義和映射,它工作得很好。該項目爲IDS使用SQL的身份特徵,我認爲它使用的是以前版本的FluentNHibernate。

上述類和映射使用NHibernate 3.1和FluentNHibernate 1.2。任何幫助將不勝感激!

+0

你是如何創建這個實體並添加到它的集合?這可能有助於發佈這樣做的代碼。 – 2011-04-25 21:06:18

+0

我只是將它們新建起來,使用標準集合add()方法添加到集合中,然後在NHibernate會話中調用add(rootEntity)。 – Andorbal 2011-04-25 21:07:49

+0

但它看起來像我發現問題......它看起來像是有一個事件監聽器,導致保存問題......當我刪除它們時,外鍵得到更新,因爲我會預料到的。 – Andorbal 2011-04-25 21:08:11

回答

0

該問題是由我正在使用的PreInsert/PreUpdate事件偵聽器引起的。我沒有考慮它,因爲我在另一個可以正常工作的項目中使用它,但是我在這個項目中對事件監聽器做出的一個更改是,我在主會話中做了另一個選擇,這似乎干擾了更新。我改變了選擇使用輔助會話,現在一切正常。

感謝您的所有建議。

0

檢查外鍵是否存在於實際的數據庫中,我使用EF有同樣的問題,這就是爲什麼,可能有幫助。

+0

它確實;最初,我忘了在外鍵列中允許NULL,並且當NHibernate嘗試向其中插入NULL時(因爲NHibernate沒有在列中插入任何值)而出現SQL錯誤。 – Andorbal 2011-04-25 20:52:41