2010-09-18 3 views
7

Hl Guys,NHibernate.StaleStateException: Неожиданный подсчет строк: 0; Ожидается: 1

Я занят написанием базовой административной программы для существующей системы. Я выбрал NHibernate для моего решения для доступа к данным и довольно новичок в этом. У меня возникает следующая ошибка в отношении родительского/дочернего:

NHibernate.StaleStateException: Неожиданные строки: 0; Ожидается: 1

Эта ошибка вызвана тем фактом, что в моем исходном коде я добавляю новый дочерний объект в дочернюю коллекцию родителя MeetingAdministrators. Когда я сохраняю родительский объект, я ожидаю, что и дети будут добавлены, однако INSERT генерируется только для родительского объекта. Nhibernate не генерирует INSERT для ребенка, но вместо этого пытается ОБНОВИТЬ ребенка, даже если он не существует. Таким образом, оно вызывает сообщение об ошибке, показанное выше. Я искал всюду в Интернете и поддерживал документацию по этому сценарию, но не нашел никакой помощи. В большинстве кодеков используются внешние ключи, которые не являются частью первичного ключа, или люди, похоже, имеют дело с отношениями «один-к-одному» или «ко многим ко многим». Мне нужно указать отображение и код так, чтобы при вставке родителя дети также вставили. Пожалуйста помоги.

Моя структура данных выглядит следующим образом:

Meeting - родительская таблица

  • MeetingID (рк) (интермедиат, идентичность)
  • Описание
  • StartDate
  • IsActive
  • Место

MeetingAdministrator - детский стол

  • MeetingID (рк, Д)
  • AdminNetworkID (рк) (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

Спасибо, миллион Dan, Это сработало. Я следил за статьей, а также добавил такие вещи, как метод Equals, в отличие от того, что я делал, что является переопределением равным и оставляет базовую реализацию там. Но это было свойство , которое сработало. Странно думать, что в этом теге так мало информации об этом – Tachi

+0

@Tachi - обязательно закройте GetHashCode; это важно, если вы будете отображать s, например ... рад, что я мог бы помочь! – DanP

+0

Ваша ссылка, к сожалению, недоступна. ( –

7

Получено такое же сообщение об ошибке, но оно было вызвано удалением. Простая причина заключалась в том, что запись уже была удалена.

+2

У меня также была такая же самая точная проблема. Кто-нибудь знает, как изящно предотвратить повторное удаление? – Kashif

+0

+1 Это обычно проблема со мной. –

1

Для тех, у кого есть проблемы со вставками с AutoNumber/AutoIncrement для MySQL, используйте сопоставление. Я обнаружил, что.Идентичность может быть темпераментной

Id(x => x.Id).GeneratedBy.Increment(); 
Смежные вопросы

 Смежные вопросы