Отображения объектов nHibernate создают ключевые нарушения - PullRequest
0 голосов
/ 07 июля 2010

У меня возникла странная ситуация, которую я пытаюсь отобразить в Fluent nHibernate. У меня есть объект Asset, который содержит как объект Image, так и объект File. Идентификатор Image и File идентичны, а объект Image содержит объект File. Эта ситуация возникает из-за того, что изображение всегда также является файлом (именно поэтому идентификаторы должны совпадать), а файл не всегда является изображением.

Я сопоставил это следующим образом:

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().Cascade.All()
    References(Function(x) x.File).LazyLoad().Cascade.All()
    References(Function(x) x.Row).Cascade().All()
    Map(Function(x) x.AssetType).CustomType(Of AssetType)()
End Sub

ImageMap

Public Sub New()
    Id(Function(x) x.ID)
    Map(Function(x) x.Height)
    Map(Function(x) x.Width)
    Map(Function(x) x.AltText)
    Map(Function(x) x.ToolTip)
    Map(Function(x) x.ImageStatus).CustomType(Of ImageStatus)()
    References(Function(x) x.Product).Nullable()
    HasOne(Function(x) x.File).Constrained()
    References(Function(x) x.ViewTag)
    HasManyToMany(Function(x As Image) x.ProductOptionValues).Table("ImageVsProductOptionValues").LazyLoad().Cascade.All()
    HasManyToMany(Function(x As Image) x.MappedCategories).Table("CategoryVsImage").LazyLoad().Cascade.All().Inverse()
End Sub

Filemap

Public Sub New()
    Id(Function(x) x.Id)
    Map(Function(x) x.Data).LazyLoad().Length(Integer.MaxValue)
    Map(Function(x) x.MimeType)
    Map(Function(x) x.Size)
    Map(Function(x) x.Filename)
    Map(Function(x) x.LastDateModified)
    Map(Function(x) x.DateCreated)
End Sub

У меня возникли проблемы при попытке использовать следующий код для создания нового изображения, добавления его в актив и сохранения.

        If oAsset.Image Is Nothing Then
            currentImage = New CMS.DataTransferObjects.Image
            currentFile = New CMS.DataTransferObjects.File
        Else
            currentImage = oAsset.Image
            currentFile = oAsset.File
        End If

        currentFile.Data = ms.ToArray
        currentFile.MimeType = mimeType
        currentFile.Filename = filImgUpload.FileName
        currentFile.Size = filImgUpload.ContentLength
        currentImage.Width = CInt(Utils.Convert.ToInt64(UploadedImage.PhysicalDimension.Width))
        currentImage.Height = CInt(Utils.Convert.ToInt64(UploadedImage.PhysicalDimension.Height))

        If oAsset.Image Is Nothing Then
            oAsset.Image = currentImage
            oAsset.File = currentFile
        Else
            'currentImage = oAsset.Image
            'currentFile = oAsset.File
        End If

Затем я вызываю диспетчер nHibernate и пытаюсь выполнить обновление. Актив обновляется, что приводит к следующей ошибке:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK30EBACDFED57EBE9". The conflict occurred in database "BDM1_TestBed", table "dbo.File", column 'Id'.

Может ли кто-нибудь помочь разобраться в этом беспорядке - я предполагаю, что мои отображения неверны, но я не уверен, как их улучшить?

1 Ответ

0 голосов
/ 08 июля 2010

Прежде чем отправлять свои мысли, я бы порекомендовал NHibernate Profiler, если вы его еще не используете.Это спасло мой приклад бесчисленное количество раз с проблемами отображения, и есть бесплатная пробная версия, если вы хотите просто попробовать.Обычно в такой ситуации просмотр SQL, сгенерированного NHIbernate (через NHProf), привел меня к решению.Проверьте это здесь: http://www.nhprof.com/

Что касается моих мыслей, похоже, ваше отображение неполное.Попробуйте добавить ForeignKey в AssetMap, например, так:

References(Function(x) x.File)
    .ForeignKey("Id")
    .LazyLoad()
    .Cascade.All()

Возможно, вам понадобится сделать то же самое для ImageMap

. Насколько я помню, Fluent NHibernate автоматически использует соглашение "Tablename_Id"если вы не укажете имя явно.

Надеюсь, это поможет.Дайте мне знать, если это не поможет.

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