2010-09-18 42 views
7

Hl夥計,NHibernate.StaleStateException:意外的行計數:0;預期:1

我正忙於爲存在的系統編寫後端管理程序。我爲我的數據訪問解決方案選擇了NHibernate,並且對它來說相當新穎。我在父母/子女關係中遇到以下錯誤:

NHibernate.StaleStateException:意外的行計數:0;預計:1個

此錯誤是由在我的源代碼我添加了新的子對象到父的孩子MeetingAdministrators收集的事實引起的。當我保存父對象時,我希望還要添加子對象,但是隻爲父對象生成一個INSERT。 Nhibernate不會爲孩子生成INSERT,而是嘗試更新孩子,即使它不存在。因此它會顯示上面顯示的錯誤信息。我在網絡和nhibernate文檔中查找了這個場景,但是沒有找到任何幫助。大多數代碼涉及不屬於主鍵的外鍵,或者人們似乎在處理一對一或多對多的關係。我需要指定映射和代碼,以便插入父項時,子項也會插入。請幫忙。

我的數據結構如下:

會議 - 父表

  • MeetingID(PK)(INT,同一性)
  • 說明
  • 的StartDate
  • IsActive
  • 地點

MeetingAdministrator - 子表

  • MeetingID(PK,FK)
  • AdminNetworkID(PK)(VARCHAR)
  • dateCreated會
  • IsActive

這裏是Visual Basic中。 NET來源:

<Serializable()> _ 
Public Class MeetingAdministrator 

    Private _MeetingID As Integer 
    Public Overridable Property MeetingID() As Integer 
     Get 
      Return _MeetingID 
     End Get 
     Set(ByVal value As Integer) 
      _MeetingID = value 
     End Set 
    End Property 

    Private _AdminNetworkID As String 
    Public Overridable Property AdminNetworkID() As String 
     Get 
      Return _AdminNetworkID 
     End Get 
     Set(ByVal value As String) 
      _AdminNetworkID = value 
     End Set 
    End Property 

    Private _IsActive As Byte 
    Public Overridable Property IsActive() As Byte 
     Get 
      Return _IsActive 
     End Get 
     Set(ByVal value As Byte) 
      _IsActive = value 
     End Set 
    End Property 

    Private _DateCreated As Date 
    Public Overridable Property DateCreated() As Date 
     Get 
      Return _DateCreated 
     End Get 
     Set(ByVal value As Date) 
      _DateCreated = value 
     End Set 
    End Property 

    Private _LastModified As Date 
    Public Overridable Property LastModified() As Date 
     Get 
      Return _LastModified 
     End Get 
     Set(ByVal value As Date) 
      _LastModified = value 
     End Set 
    End Property 

    Private _meeting As Meeting 
    Public Overridable Property Meeting() As Meeting 
     Get 
      Return _meeting 
     End Get 
     Set(ByVal value As Meeting) 
      _meeting = value 
     End Set 
    End Property 

    Public Overrides Function Equals(ByVal obj As Object) As Boolean 
     Return MyBase.Equals(obj) 
    End Function 

    Public Overrides Function GetHashCode() As Integer 
     Return MyBase.GetHashCode() 
    End Function 

End Class 




Imports Iesi.Collections 
Imports Iesi.Collections.Generic 



Public Class Meeting 

    Private _MeetingID As Integer 
    Private _Description As String 

    Public Overridable Property MeetingID() As Integer 
     Get 
      Return _MeetingID 
     End Get 
     Set(ByVal value As Integer) 
      _MeetingID = value 
     End Set 
    End Property 

    Public Overridable Property Description() As String 
     Get 
      Return _Description 
     End Get 
     Set(ByVal value As String) 
      _Description = value 
     End Set 
    End Property 

    Private _StartDate As Date = Now 
    Public Overridable Property StartDate() As Date 
     Get 
      Return _StartDate 
     End Get 
     Set(ByVal value As Date) 
      _StartDate = value 
     End Set 
    End Property 

    Private _IsActive As Byte 
    Public Overridable Property IsActive() As Byte 
     Get 
      Return _IsActive 
     End Get 
     Set(ByVal value As Byte) 
      _IsActive = value 
     End Set 
    End Property 

    Private _DateCreated As Date 
    Public Overridable Property DateCreated() As Date 
     Get 
      Return _DateCreated 
     End Get 
     Set(ByVal value As Date) 
      _DateCreated = value 
     End Set 
    End Property 

    Private _Venue As String 
    Public Overridable Property Venue() As String 
     Get 
      Return _ Venue 
     End Get 
     Set(ByVal value As String) 
      _ Venue = value 
     End Set 
    End Property 

    Private _meetingAdministrator As ISet(Of MeetingAdministrator) 
    Public Overridable Property MeetingAdministrators() As ISet(Of MeetingAdministrator) 
     Get 

      Return _meetingAdministrator 
     End Get 
     Set(ByVal value As ISet(Of MeetingAdministrator)) 
      _meetingAdministrator = value 
     End Set 
    End Property 

    Public Overridable Sub AddAdministrator(ByVal meetingAdministrator As MeetingAdministrator) 
     meetingAdministrator.Meeting = Me 

     _meetingAdministrator.Add(meetingAdministrator) 
    End Sub 


    Public Sub New() 
     _meetingAdministrator = New HashedSet(Of MeetingAdministrator)() 

    End Sub 
End Class 

以下是映射文件:

<!-- Meeting.hbm.xml --> 
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" 
        namespace="Data.Domain" > 

    <!-- Mapping Information --> 
    <class name="Meeting" table="Meeting" > 
    <id name="MeetingID" column="MeetingID" type="int"> 
     <generator class="identity" /> 
    </id> 
    <property name="Description" /> 
    <property name="StartDate" /> 
    <property name="IsActive" /> 
    <property name="Venue" /> 
    <set name="MeetingAdministrators" table="MeetingAdministrator" inverse="true" lazy="true" cascade="save-update" access="property" > 
     <key column="MeetingID" foreign-key="MeetingID" /> 
     <one-to-many class="Meeting" /> 
    </set> 
    </class> 
</hibernate-mapping> 

<!-- MeetingAdministrator.hbm.xml --> 
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" 
        namespace="Data.Domain" > 

    <!-- Mapping Information --> 
    <class name="MeetingAdministrator" table="MeetingAdministrator" > 
    <composite-id> 
     <key-property name="AdminNetworkID" column="AdminNetworkID" type="string" > 
     </key-property> 
     <key-many-to-one name="Meeting" class="Meeting" > 
     <column name="MeetingID" /> 
     </key-many-to-one> 
    </composite-id> 
    <property name="IsActive" /> 
    <property name="DateCreated" /> 
    </class> 
</hibernate-mapping> 

回答

6

我敢肯定你會需要一個<version/>屬性添加到您的MeetingAdministrator類有這個工作propertly。進一步討論見this article

+0

萬分感謝丹,這工作。 我跟着文章和喜歡的Equals方法,而不是我在做什麼,這是覆蓋equals和離開基地執行也有添加的東西。但它是工作的財產。 奇怪的是認爲有這個標記,以便明確一點的信息在那裏 – Tachi 2010-09-18 11:42:56

+0

@Tachi - 一定要重寫GetHashCode爲好;這是很重要的,如果你會被映射 S表示例如...很高興我能幫助! – DanP 2010-09-18 12:46:47

+0

你的鏈接很不幸死了;( – 2015-05-16 12:47:14

7

得到相同的錯誤信息,但它是由刪除觸發的。簡單的原因是該條目已經被刪除。

+2

我也有同樣的確切的問題,有誰知道如何優雅地防止重複刪除? – Kashif 2012-09-28 23:00:31

+0

+1這其實是我的問題。 – 2012-10-24 13:18:39

1

對於任何使用AutoNumber/AutoIncrement for MySQL插入問題的人都使用映射。我發現了。標識可以是氣質

Id(x => x.Id).GeneratedBy.Increment(); 
相關問題