1

我有一些多余的主键问题。

我有一个包含许多报告的项目。我已将它们映射如下所示。我可以做到Session.QueryOver(Of Item).List,并且没有生成额外的列。我也可以这样做Session.QueryOver(Of Report).List,并且没有生成额外的列。

但是,一旦我尝试遍历从 Item 到 Reports 的关系,就会得到如下所示的 SQL 查询。谁能告诉我为什么?提前致谢!

项目映射:

Public Class ItemMapping
    Inherits ClassMap(Of Item)
    Public Sub New()
        Table("Items")
        Id(Function(x) x.ItemID)
        HasMany(Function(x) x.Reports).KeyColumn("ItemID").Inverse().Cascade.All()
    End Sub
End Class

报告映射:

Public Class ReportMapping
    Inherits ClassMap(Of Report)
    Public Sub New()
        Table("Reports")
        Id(Function(x) x.ReportID)
        References(Function(x) x.Item).Column("ItemID")
        Map(Function(x) x.ReportName)
    End Sub
End Class

SQL 结果:

SELECT repor0_.ItemID as ItemID1_, 
repor0_.ReportID as Rep1_1_, 
repor0_.ReportID as Rep1_4_0_, 
repor0_.ReportName as Rep2_4_0_, 
repor0_.ItemID as ItemID4_0_ FROM dbo.Reports repor0_ WHERE repor0_.ItemID=@p0;@p0 = 1266 [Type: Int32 (0)]
4

2 回答 2

4

根据 nhusers group 的说法,这不是一个错误。显然 NHibernate 使用一列作为 ID,第二列作为外键。还有其他一些列被发送两次的情况。根据线程,优化多余的列是不值得的,因为它不会产生额外的 I/O 使用,并且在正常情况下,额外的列不会导致过多的网络流量。

于 2011-12-28T16:45:04.737 回答
0

我在您提供的映射文件中的任何地方都看不到“reportdate”,而它在您的查询中,因此我怀疑您的项目中还有其他我们目前看不到的映射?

于 2011-12-28T07:25:02.850 回答