Как я могу получить список сущностей в NHibernate, где ParentId может ссылаться на разные таблицы - PullRequest
0 голосов
/ 30 октября 2010

Я новичок в NHibernate, поэтому я уверен, что мне просто не хватает чего-то фундаментального.

У меня есть таблица с именем Issue, в которой есть столбец ParentId.ParentId может ссылаться на разные таблицы (например, Project или Customer и т. Д.). Как я могу выполнить этот запрос в NHibernate, чтобы я мог отображать только те проблемы, которые относятся к Project.Вот что я попробовал.

            DetachedCriteria dCriteria = DetachedCriteria.For<Issue>("issue")
            .SetProjection(Projections.Property("ParentId"))
            .CreateAlias("Project", "project", NHibernate.SqlCommand.JoinType.InnerJoin)
            .Add(Restrictions.EqProperty("issue.ParentId", "project.Id"))
            ;
        var issues = Session.CreateCriteria<Issue>("issue")
                .Add(Subqueries.Exists(dCriteria)).List<Issue>();
        return issues;

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

    <class name="Issue" table="dbo.Issue" lazy="true">
    <id name="Id" column="Id">
        <generator class="assigned" />
    </id>

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

    <property name="Name" />

    <property name="Description" />

Буду признателен за любые указания.

возможно, мне следует немного объяснитьБольше.У меня есть сетка всех проблем, и я хочу показать столбец типа, чтобы мы знали, какой тип проблемы (проект и т. Д.) Столбец не служит никакой другой цели, кроме этого, поэтому я не верю, что он действителен длядобавить его в базу данных.В SQL достаточно просто отфильтровать данные с помощью объединения или использования Exists.Должен быть похожий метод в NHibernate, поэтому мне не нужно проходить через каждый проект для всех его проблем.

Ответы [ 2 ]

1 голос
/ 30 октября 2010
  1. Вы не должны использовать идентификаторы внешнего ключа непосредственно в своих объектах - это ориентированный на данные подход. С NHibernate вы работаете с реальными объектами или коллекциями реальных объектов, чтобы представить отношения. Nhibernate позаботится о внешних ключах в вашей БД автоматически

  2. Я бы использовал интерфейс или базовый класс для представления различных элементов, которые можно использовать в качестве родителя, если вам действительно нужно, чтобы Issue имела ссылку на своего родителя. Но, вероятно, вы не так, как вы, скорее всего, будете получать, например, «клиент», а затем итерации по вопросам.

  3. Назначенные идентификаторы, как правило, плохие идея. Лучше использовать что-то вроде HiLo или собственные базы данных генератор.

Например, ваши объекты могут выглядеть примерно так:

public class Issue
{
   public int Id{ get; set; }
   public IHazIssues Parent { get; set; } //If you really need this
   public string Name { get; set; }
   public string Description { get; set; }
}

public class Customer : IHazIssues 
{
   public int Id{ get; set; }
   public IList<Issue> Issues { get; set; }
   public string NAme{ get; set; }
}

//If you don't need the parent mapping on Item you don't need this.
public interface IHazIssues 
{
   IList<Issue> Issues { get; set; }
}

и т.д ...

0 голосов
/ 30 октября 2010

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

Если вы сделаете это, вы сможете точно сопоставить его с помощью NHibernate.

Если вы не можете по какой-то причине, возможно, вы ищете любое сопоставление.

...