我有一些多余的主键问题。
我有一个包含许多报告的项目。我已经映射了它们,如下所示。我可以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)]
答案 0 :(得分:3)
这是not a bug according to nhusers group。显然,NHibernate使用一列作为ID,第二列使用外键。还有一些其他情况下,某些列被发送两次。根据该线程,优化额外的列是不值得的,因为它不会产生额外的I / O使用,并且在正常情况下额外的列不会导致过多的网络流量。
答案 1 :(得分:0)
我在你提供的映射文件的任何地方都没有看到'reportdate',而在你的查询中却有,因此我怀疑你的项目中还有其他我们目前看不到的映射?