NHibernate.StaleStateException: неожиданное количество строк: 0; ожидается: 1 - PullRequest
9 голосов
/ 18 сентября 2010

Ребята,

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

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

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

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

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

  • MeetingID (pk) (int, identity)
  • Описание
  • 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>

Ответы [ 3 ]

8 голосов
/ 27 апреля 2011

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

6 голосов
/ 18 сентября 2010

Я почти уверен, что вам нужно добавить свойство <version/> в ваш класс MeetingAdministrator, чтобы это работало правильно. См. эту статью для дальнейшего обсуждения.

1 голос
/ 23 января 2013

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

Id(x => x.Id).GeneratedBy.Increment();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...