Свободный nHibernate вызывает осиротевшие строки - PullRequest
1 голос
/ 30 июня 2010

У меня проблема с циклом, который должен добавлять объекты 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

Может кто-нибудь сказать мне, что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...