子类ID上的Nhibernate每子类表标准使用父表中的键列

时间:2010-12-14 14:59:09

标签: c# nhibernate inheritance nhibernate-criteria

我在我的应用程序中使用每个子类策略的表继承,如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>

1 个答案:

答案 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的第二个映射解决了问题。

无论如何,我的错误!