我在我的应用程序中使用每个子类策略的表继承,如Ayende的帖子here中所述。
但是,当我特别查询子类,比如说公司,并过滤Id(我知道)时,生成的SQL不正确并在SQL Server中给出了一个错误。 标准:
session.CreateCriteria<Company>()
.Add(Expression.Eq("Id", 25)
.List<Company>();
生成的SQL:
SELECT this_.PartyId,
this_.CompanyName
FROM Companies this_
inner join Parties this_1_
on this_PartyId = this_1_.Id
WHERE this_1_.PartyId = 25
问题(最后一行 - 在Parties表中未定义PartyId)是子表中的键列在父表中使用。 由于“Id”来自C#中的Party类,所以它有点意义。但为什么它使用键列“PartyId”而不是Party映射中定义的Id“Id”?我怎样才能让它发挥作用?
谢谢!
编辑:根据要求,这里是映射(与博客文章中的映射相同)
<class name="Party"
abstract="true"
table="Parties">
<id name="Id">
<generator class="identity"/>
</id>
<joined-subclass
table="People"
name="Person">
<key column="PartyId"/>
<property name="FirstName"/>
</joined-subclass>
<joined-subclass
table="Companies"
name="Company">
<key column="PartyId"/>
<property name="CompanyName"/>
</joined-subclass>
答案 0 :(得分:0)
我终于找到了问题。 我在映射中犯了一个错误(我使用Fluent NHibernate给我上面看到的映射)并且我在Party类中映射了两次Id:
public class PartyMap : ClassMap<Party>
{
public PartyMap()
{
Table("Parties");
Id(p => p.Id).GeneratedBy.Assigned();
Map(p => p.Id);
}
}
由于“Id”已被映射(而不是Id),因此在向公司的Id添加where子句时,NHibernate感到困惑,并使用键列“PartyId”作为“Id”的映射列,非常令人困惑! 删除Id的第二个映射解决了问题。
无论如何,我的错误!