有点奇怪的情况,我试图在Fluent nHibernate中映射并失败。我有一个Asset对象,它包含一个Image对象和一个File对象。图像和文件的ID相同,Image对象包含File对象。出现这种情况是因为Image始终也是一个文件(这就是Id必须匹配的原因)但文件并不总是图像。
我将其映射如下:
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
图像映射
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'.
任何人都可以帮忙解决这个问题 - 我认为我的映射是错误的,但我不确定如何改进它们?
答案 0 :(得分:0)
在发表我的想法之前,如果你还没有使用它,我会推荐NHibernate Profiler。它通过映射问题无数次地保存了我的屁股,如果你想尝试一下就可以免费试用。通常,在这种情况下,看到NHIbernate生成的SQL(通过NHProf)让我找到了解决方案。请在此处查看:http://www.nhprof.com/
至于我的想法,看起来你的映射看起来不完整。尝试将ForeignKey添加到AssetMap,如下所示:
References(Function(x) x.File)
.ForeignKey("Id")
.LazyLoad()
.Cascade.All()
您可能需要对ImageMap执行相同的操作
根据我的记忆,如果你没有明确指定名称,Fluent NHibernate将自动使用约定“Tablename_Id”。
希望有所帮助。如果不这样做,请告诉我。