0

遇到了一些奇怪的情况,我试图在 Fluent nHibernate 中进行映射并且失败了。我有一个包含 Image 对象和 File 对象的 Asset 对象。Image 和 File 的 Id 相同,Image 对象包含一个 File 对象。出现这种情况是因为图像始终也是文件(这就是 Id 必须匹配的原因),但文件并不总是图像。

我已将其映射如下:

资产地图

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

文件映射

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 管理器并尝试 .Update 资产,这会导致以下错误:

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

任何人都可以帮助解决这个混乱 - 我认为我的映射是错误的,但我不知道如何改进它们?

4

1 回答 1

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”。

希望有帮助。让我知道如果那不这样做。

于 2010-07-08T11:51:14.720 回答