У меня возникла странная ситуация, которую я пытаюсь отобразить в 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'.
Может ли кто-нибудь помочь разобраться в этом беспорядке - я предполагаю, что мои отображения неверны, но я не уверен, как их улучшить?