.NET Castle ActiveRecord - объект, составленный сам по себе - PullRequest
0 голосов
/ 07 октября 2011

Я пытаюсь использовать приведенный ниже код для представления состава продукта, я могу успешно вставить продукт со списком продуктов внутри него, но когда я пытаюсь снова отредактировать и сохранить «основной продукт», он выдает следующее сообщение для меня: «другой объект с таким же значением идентификатора уже был связан с сеансом: 1 объекта: Project.Product»

Я полагаю, что это как-то связано с сохранением продукта внутри каждого компонента в свойстве MasterProduct.

Извините за мой английский, я работаю над этим.

Imports Castle.ActiveRecord

<ActiveRecord()> _
Public Class Product
    Private _components As IList = New ArrayList
    Private _masterProduct As Product

    <[HasAndBelongsToMany](GetType(Product), Table:="Components", _
     ColumnKey:="productId", ColumnRef:="componentId", _
     cascade:=ManyRelationCascadeEnum.AllDeleteOrphan)> _
    Public Overridable Property Components() As IList
        Get
            Return Me._components
        End Get
        Set(ByVal value As IList)
            Me._components = value
        End Set
    End Property

    <BelongsTo()>
    Public Overridable Property MasterProduct() As Product
        Get
            Return Me._masterProduct
        End Get
        Set(ByVal value As Product)
            Me._masterProduct = value
        End Set
    End Property

End Class

По запросу, код персистентности, я сделал некоторую абстракцию, извините, если что-то пропустил ..

Public Class Controller
Private _view As Object

Public Property View() As Object
    Get
        Return _view
    End Get
    Set(ByVal value As Object)
        _view = value
    End Set
End Property

'Here the controller opens a new view, and get the data for it..
'In this method all the Products will be listed in a treeview, so the users can select and edit them.
Public Overridable Sub openModule()
    'Code(...)

    Dim genericView As New frmGenericSelection(Title, Me)

    With genericView

        'Code(...)

        Using SS As New SessionScope(FlushAction.Never)
            call LoadAllProducts(.lstProducts)
        End Using
        Call .ShowDialog()
    End With
End Sub

'This is the saving method, it is called by the "frmGenericSelection", passing the SelectedObject for edition.
'Or, if there's a new product, passing "New Product"..
Public Sub EditObject(ByVal Obj As Object)
    If (View Is Nothing) Then View = Activator.CreateInstance(Type.GetType("Project.frm" & Mid(Me.GetType.Name, 3)))
    Using SS As New SessionScope(FlushAction.Never)
        If Obj.Versao <> 0 Then Obj.Refresh()

        View.updateView(Obj)
        If (View.ShowDialog() = DialogResult.OK) Then 'User pressed the "Save" button, the view has returned to the controller, telling it to save the object..
            Try
                Obj.SaveAndFlush()
                MsgBox("Sucefully Saved!", MsgBoxStyle.Information, Obj.Title)
            Catch ex As Exception 
                'Code(...)
            End Try
        End If
        Obj = Nothing
        View = Nothing
    End Using
End Sub

End Class
...