2010-09-18 37 views
7

Hl Guys,NHibernate.StaleStateException: Số hàng không mong đợi: 0; dự kiến: 1

Tôi đang bận viết chương trình quản trị phụ trợ cho hệ thống tồn tại. Tôi đã chọn NHibernate cho giải pháp truy cập dữ liệu của tôi và khá mới mẻ với nó. Tôi gặp phải lỗi sau trong mối quan hệ cha/con:

NHibernate.StaleStateException: Số hàng không mong muốn: 0; dự kiến: 1

Lỗi này là do mã nguồn của tôi thêm đối tượng con mới vào bộ sưu tập con của cha mẹ của MeetingAdministrators. Khi tôi lưu đối tượng cha mẹ, tôi mong đợi các con được thêm vào, tuy nhiên một INSERT chỉ được tạo ra cho đối tượng cha. Nhibernate không tạo ra một INSERT cho trẻ nhưng thay vào đó cố gắng để UPDATE đứa trẻ mặc dù nó không tồn tại. Do đó nó sẽ trả về thông báo lỗi được hiển thị ở trên. Tôi đã xem ở khắp mọi nơi trên trang web và tài liệu nhibernate cho kịch bản này nhưng không tìm thấy bất kỳ trợ giúp nào. Hầu hết mã đều liên quan đến các khoá ngoại không phải là một phần của khóa chính, hoặc mọi người dường như đang xử lý các mối quan hệ một-một hoặc nhiều-nhiều. Tôi cần phải xác định ánh xạ và mã để chèn vào phụ huynh, các em cũng được chèn vào. Hãy giúp tôi.

cấu trúc dữ liệu của tôi là như sau:

hội họp - bảng cha

  • MeetingID (pk) (int, danh tính)
  • Mô tả
  • StartDate
  • IsActive
  • Địa điểm

MeetingAdministrator - bảng con

  • MeetingID (pk, fk)
  • AdminNetworkID (pk) (varchar)
  • DateCreated
  • IsActive

Và đây là Visual Basic. NET source:

<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 

Dưới đây là các tập tin bản đồ:

<!-- 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> 

Trả lời

6

Tôi khá chắc chắn rằng bạn sẽ cần phải thêm một tài sản <version/> đến lớp MeetingAdministrator của bạn để có điều này làm việc propertly. Xem this article để thảo luận thêm.

+0

Cảm ơn một triệu người, Điều đó đã hiệu quả. Tôi đã theo dõi bài viết và cũng thêm những thứ như phương thức Equals trái ngược với những gì tôi đang làm, đó là ghi đè bằng và để lại việc thực hiện cơ sở ở đó. Nhưng đó là tài sản hoạt động. Thật kỳ lạ khi nghĩ rằng có rất ít thông tin rõ ràng về thẻ này ngoài đó – Tachi

+0

@Tachi - hãy nhớ ghi đè GetHashCode; điều này là quan trọng nếu bạn sẽ được ánh xạ s ví dụ ... vui vì tôi có thể giúp! – DanP

+0

liên kết của bạn không may đã chết, ( –

7

Có cùng thông báo lỗi nhưng đã được kích hoạt bởi xóa. Lý do đơn giản là mục nhập đã bị xóa trước đó.

+2

Tôi cũng gặp vấn đề chính xác này. Có ai biết cách ngăn chặn lặp lại một cách duyên dáng không? – Kashif

+0

+1 Điều này một cách ussually vấn đề với tôi. –

1

Đối với bất kỳ ai gặp sự cố với chèn bằng AutoNumber/AutoIncrement cho MySQL, hãy sử dụng ánh xạ. Tôi thấy rằng.Danh tính có thể là thông thường

Id(x => x.Id).GeneratedBy.Increment(); 
Các vấn đề liên quan