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>
Спасибо, миллион Dan, Это сработало. Я следил за статьей, а также добавил такие вещи, как метод Equals, в отличие от того, что я делал, что является переопределением равным и оставляет базовую реализацию там. Но это было свойство, которое сработало. Странно думать, что в этом теге так мало информации об этом –
Tachi
@Tachi - обязательно закройте GetHashCode; это важно, если вы будете отображать s, например ... рад, что я мог бы помочь! –
DanP
Ваша ссылка, к сожалению, недоступна. ( –