Критерии таблицы на подкласс Nhibernate для идентификатора подкласса используют ключевой столбец в родительской таблице

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

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

Решение

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

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

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

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

Другие вопросы по тегам