Я пытаюсь использовать приведенный ниже код для представления состава продукта, я могу успешно вставить продукт со списком продуктов внутри него, но когда я пытаюсь снова отредактировать и сохранить «основной продукт», он выдает следующее сообщение для меня:
«другой объект с таким же значением идентификатора уже был связан с сеансом: 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