nHibernate рассчитывает на не отображенную сущность - PullRequest
0 голосов
/ 15 июня 2011

Использование nHibernate 2.

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

class PointerTable
{
    public int ID;
    public string ObjectName;
    public int RecordID;
    ... additional fields
}

Поля ObjectName и RecordID указывают на имя другой таблицы в системе и идентификатор записи в этой таблице, на которую указывает эта запись.Между этой таблицей и другими таблицами в системе нет взаимосвязей.

Мне нужно иметь возможность присоединиться к этой таблице, когда я получаю записи из других таблиц в системе, так как мне нужно определить, является лиТаблица имеет любые записи в PointerTable, которые указывают на нее.то есть получить количество записей в PointerTable для этой записи.

Я пытался сделать это на HQL:

select a.ID, e.Field1, a.Field2, a.Field3,
            count(select * 
             from PointerTable p
             where p.ObjectName = "Table1"
               and p.RecordID = a.ID)
from Table1 a 
where a.ParentTable.ID = :ID

Я также изучил возможность размещения отображения вФайлы конфигурации XML для всех объектов в системе, на которые будет указывать эта таблица.Таким образом, у меня может быть коллекция записей PointerTable в каждой из моих других сущностей.Хотя я не уверен, возможно ли это.Я не могу найти, как настроить отображение на 2 поля, а не на первичный ключ.

Что-то вроде:

<bag name="PointerRecords" table="PointerTable" lazy="true" inverse="true">      
     <key>
         <column name="ThisEntityID" />
         <column name="ObjectName" />  ?? Hard coded
    </key>
    <one-to-many class="PointerTable" not-found="ignore"/>      
</bag>

Возможно ли это вообще?

В основном все, что я пытаюсь сделать, это следующий SQL-запрос.Но в идеале мы хотели бы сделать это через HQL или сопоставления.

SQL

select a.ID, e.Field1, a.Field2, a.Field3, Count(d.ID)
from Table1 a 
inner join Table2 e on a.ParentID=e.ID
left outer join PointerTable d on d.ObjectName = 'Table1' and d.RecordID = a.ID
where c.ID = @ID
group by a.ID, e.Field1, a.Field2, a.Field3

1 Ответ

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

идея заключается в том, чтобы сопоставить эту коллекцию с предложением where

с использованием fluentmapping:

public SomeEntityMap(){
    Table("SomeTable");

    HasMany(x => x.PointerRecords)
        .Table("PointerTable")
        .KeyColumn("ThisEntityID")
        .Where("ObjectName = 'SomeTable'")
}

Начать редактирование

с использованием xml-отображения

<bag name="PointerRecords" table="PointerTable" lazy="true" inverse="true" where ="ObjectName = 'SomeTable'">
    <key column="ThisEntityID"/>
    <one-to-many class="PointerTable" not-found="ignore"/>
</bag>

Конец редактирования

и запрос как

object[] results = session.CreateCriteria<SomeEntity>()
    .Add(Restrictions.Eq("Id", id))
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Field1"))
        ...
        .Add(Projections.Count("PointerRecords")));
    .List()

или

var entities = session.CreateCriteria<SomeEntity>()
    .Add(Restrictions.Eq("Id", id)
    .SetFetchMode("PointerRecords", NHibernate.FetchMode.Eager)
    .List<SomeEntity>();

entities[0].PointerRecords.Count
...