Критерии таблицы на подкласс Nhibernate для идентификатора подкласса используют ключевой столбец в родительской таблице - PullRequest
0 голосов
/ 14 декабря 2010

Я использовал таблицу для каждого подкласса для наследования в своем приложении, как описано в посте Айенде здесь .

Однако, когда я специально запрашиваю подкласс, скажем Company, и фильтрую по 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

Проблема (последняя строка - PartyId не определена в таблице Сторон) заключается в том, что ключевой столбец в дочерней таблице используется в родительской таблице. Так как «Id» происходит от класса партии в C #, это имеет смысл. Но почему он использует ключевой столбец "PartyId" вместо идентификатора "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 голосов
/ 15 декабря 2010

Я наконец нашел проблему. Я сделал ошибку в отображениях (я использовал Fluent NHibernate, чтобы дать мне сопоставления, которые вы видите выше), и я дважды отобразил Id в классе Party:

public class PartyMap : ClassMap<Party>
{
    public PartyMap()
    {
        Table("Parties");
        Id(p => p.Id).GeneratedBy.Assigned();
        Map(p => p.Id);
    }
}

Так как «Id» был отображен (не как Id), при добавлении предложения where к Id компании, NHibernate был сбит с толку и использовал ключевой столбец «PartyId» в качестве сопоставленного столбца для «Id», что весьма запутанно! Удаление второго сопоставления для Id решило проблему.

В любом случае, моя ошибка!

...