nHibernate对象映射会创建密钥违规

时间:2010-07-07 14:01:38

标签: .net nhibernate fluent

有点奇怪的情况,我试图在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'.

任何人都可以帮忙解决这个问题 - 我认为我的映射是错误的,但我不确定如何改进它们?

1 个答案:

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

希望有所帮助。如果不这样做,请告诉我。