Подзапрос NHibernate (3.1) для подкласса, не присоединяющегося к таблице базового класса - PullRequest
2 голосов
/ 13 мая 2011

Ниже приведена абстракция реальной проблемы, с которой я столкнулся.

public class Base
{
    public virtual string Id { get; set; }
    public virtual string Foo { get; set; }
}

public class Sub : Base
{
    public virtual string Bar { get; set; }
    public virtual Other Other { get; set; }
}

public class Other
{
    public virtual string Id { get; set; }
    public virtual ICollection<Sub> Subs { get; set; }
}

отображение:

<class name="Base" table="base_table" xmlns="urn:nhibernate-mapping-2.2">
  <id name="Id" column="id">
    <generator class="assigned" />
  </id>
  <property name="Foo" column="Foo" />

  <joined-subclass name="Sub" table="sub_table">
    <key column="id" />
    <property    name="Bar"   column="Bar" />
    <many-to-one name="Other" column="other_id" />
  </joined-subclass>

</class>

<class name="Other" table="other_table" xmlns="urn:nhibernate-mapping-2.2">
  <id name="Id" column="id">
    <generator class="assigned" />
  </id>
  <set name="Subs" inverse="true" lazy="true">
    <key column="other_id" />
    <one-to-many class="Sub" />
  </set>
</class>

Следующим не удается выполнить соединение в подклассе join внутри подзапроса:

Session.Query<Other>().Where(o => o.Subs.Any(s => s.Foo == "xyz"));

Sql

select
    other0_.id as id60_
from
    other_table other0_
where
    exists (
        select
            subs1_.id
        from
            sub_table subs1_
        where
            other0_.id=subs1_.other_id
            and subs1_1_.Foo=:p0
    );
:p0 = 'xyz' [Type: String (0)]

Генерируется исключение GenericADOException, поскольку subs1_1_ (например, sub_table) в подзапросе не имеет Foo. Есть ли что-то, что я должен сделать в сопоставлении Other, чтобы Subs были полностью объединены с Base в подзапросе?

1 Ответ

1 голос
/ 18 июня 2011

Возможно, это проблема поставщика linq, связанная с отображением присоединенного подкласса. Запрос хорошо работает для таблицы в иерархии. Попробуйте это:

<class name="Base" table="base_table" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" column="id">
        <generator class="assigned" />
    </id>

    <discriminator column="Type" type="String" />

    <property name="Foo" column="Foo" />

    <subclass name="Sub" discriminator-value="Sub">
        <property    name="Bar"   column="Bar" />
        <many-to-one name="Other" column="other_id" />
    </subclass>
</class>

<class name="Other" table="other_table" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" column="id">
        <generator class="assigned" />
    </id>
    <set name="Subs" inverse="true" lazy="true">
        <key column="other_id" />
        <one-to-many class="Sub" />
    </set>
</class>

Неудачно соединенный подкласс не может быть заменен таблицей для иерархии во всех случаях ...

Есть некоторые проблемы, зарегистрированные в NH jira, которые похожи ( NH-2564 , NH-2491 ), но не уверены, что они действительно связаны.

EDIT: Та же проблема с HQL: from Other o where exists(from o.Subs s where s.Foo = 'xyz'), поэтому это не проблема, связанная с поставщиком linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...