У меня проблема с циклом, который должен добавлять объекты nHibernate к существующим объектам nHibernate и сохранять.Здесь есть целое дерево отношений, есть объект Page, который может иметь много объектов Region, которые, в свою очередь, могут иметь много объектов Row, которые могут иметь много объектов Asset - проблема где-то в последних трех, и я предоставил сопоставления ниже:
AssetMap
Public Sub New()
Id(Function(x) x.Id)
Map(Function(x) x.DisplayOrder)
Map(Function(x) x.Text).Length(10000)
Map(Function(x) x.Title)
Map(Function(x) x.Width)
Map(Function(x) x.Height)
References(Function(x) x.Image).LazyLoad()
References(Function(x) x.Row).Cascade().All()
Map(Function(x) x.AssetType).CustomType(Of AssetType)()
End Sub
RowMap
Public Sub New()
Id(Function(x) x.Id)
Map(Function(x) x.CssBackgroundId)
Map(Function(x) x.DisplayOrder)
Map(Function(x) x.RowType).CustomType(Of RowType)()
HasMany(Function(x) x.Assets).OrderBy("DisplayOrder").Cascade.All()
References(Function(x) x.Region).Cascade().All()
End Sub
RegionMap
Public Sub New()
Id(Function(x) x.Id)
References(Function(x) x.RegionTemplate)
HasMany(Function(x) x.Rows).OrderBy("DisplayOrder").Cascade.All()
Map(Function(x) x.RegionId)
References(Function(x) x.Workflow)
References(Function(x) x.Page)
Map(Function(x) x.Ranking)
End Sub
Предполагается, что проблемный код перебирает некоторый объект хранения данных, создаетЗатем объект Row создает несколько объектов Asset, добавляет их в объект Row и затем добавляет Row в коллекцию.Наконец, недавно заполненная строка добавляется в объект Region.
Код работает нормально, когда вы впервые начинаете настраивать Rows и Assets для Region.Проблема начинается, когда вам нужно внести в нее изменения, и она сохраняется во второй раз - в этот момент nHibernate создает два совершенно новых объекта строки, присоединяет к ним существующие активы и теряет две старые строки, оставляя их с нулевыми идентификаторами.
For Each oAsset As FrontEndService.PageAsset In assetCollection
Dim oRow = New Cms.DataTransferObjects.Row
oRow.Assets = BuildAssets(oAsset, oRow, regionPos, oPage)
oRowCollection.Add(orow)
Next
Private Function BuildAssets(ByVal oAsset As FrontEndService.PageAsset, ByVal oRow As Cms.DataTransferObjects.Row, ByVal RegionPos As Integer, ByRef oPage As Cms.DataTransferObjects.Page) As List(Of Cms.DataTransferObjects.Asset)
Dim oColumnCollection As New List(Of Cms.DataTransferObjects.Asset)
oRow.DisplayOrder = oAsset.pageAssetOrder
oRow.RowType = DirectCast(CInt(oAsset.pageAssetType), Cms.DataTransferObjects.RowType)
Dim noOfColumns As Integer = GetAmountOfCellsByType(oAsset.pageAssetType)
For iColumncount As Int32 = 0 To noOfColumns - 1
Dim oPageColumn = New Cms.DataTransferObjects.Asset
oPageColumn.DisplayOrder = iColumncount + 1
oPageColumn.AssetType = GetAssetType(oAsset.pageAssetType, iColumncount + 1)
oPageColumn.Width = CInt(oPage.Regions(RegionPos).RegionTemplate.Width / noOfColumns)
oColumnCollection.Add(oPageColumn)
Next
Return oColumnCollection
End Function
Может кто-нибудь сказать мне, что я делаю не так?