NHibernate.StaleStateException : Unexpected row count: 0; expected: 1

标签 nhibernate nhibernate-mapping parent-child

HL Guys,

我正在为现有系统编写后端管理程序。我选择了NHibernate作为我的数据访问解决方案,并且对它来说还很陌生。我在 parent /子女关系中遇到以下错误:

NHibernate.StaleStateException : Unexpected row count: 0; expected: 1



该错误是由以下事实引起的:在我的源代码中,我将新的子对象添加到MeetingAdministrators的父级子级集合中。保存父对象时,我希望还添加子对象,但是仅为父对象生成INSERT。 Nhibernate不会为子代生成INSERT,而是尝试更新子代,即使该子代不存在也是如此。因此,它会显示上面显示的错误消息。我在网上和nhibernate文档中到处都找到了这种情况,但没有找到任何帮助。大多数代码都涉及不属于主键的外键,或者人们似乎正在处理一对一或多对多的关系。我需要指定映射和代码,以便在插入父项时也插入子项。请帮忙。

我的数据结构如下:

session –父表
  • 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>
    

    最佳答案

    我很确定您需要在<version/>类中添加MeetingAdministrator属性,以使其正常工作。有关更多讨论,请参见this article

    关于NHibernate.StaleStateException : Unexpected row count: 0; expected: 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3741408/

    相关文章:

    c# - 在同一张表上映射多对多关系

    c# - SQLite 连接策略

    nhibernate - 删除的对象将通过 nhibernate 中的级联(从关联中删除删除的对象)重新保存

    c# - NHibernate.MappingException 无法确定 : Entity 的类型

    oracle - Oracle中的父子关系

    java - 是否可以在父 pom 文件中包含 <packaging>jar</packaging> ?

    nhibernate - 在 Fluent NHibernate 中映射嵌套组件

    c# - 如何使用代码映射在 NHibernate 中映射 Enum

    vb.net - 如何告诉 Fluent NHibernate 在不进行自动映射的情况下忽略特定属性?

    ruby - 将父类初始化的变量传递给子类的实例