nHibernate "HasMany" без явных ФК - PullRequest
0 голосов
/ 31 июля 2009

У меня есть модель данных, которую я не уверен, что свободно поддерживает nHibernate - мне было интересно, кто-нибудь может сказать мне, если это так, и если да, то как это сделать.Базовая структура:

create table Container (
  id int identity(1,1) NOT NULL,
  root_item_id int
)

create table ItemRelationship (
   id int identity(1, 1) NOT NULL,
   parent_item_id INT,
  child_item_id INT
)

create table Item (
   id int identity(1, 1) NOT NULL,
   description VARCHAR(20)
)

Итак, в двух словах: 1) Контейнер имеет корневой элемент. 2) Элементы могут иметь дочерние элементы. Элементы

То, что я хочу, - это свойство моего "контейнера".сущность, которая является коллекцией предметов, которые являются детьми своего корневого предмета.Я вижу, как настроить "прямые" отношения FK, но это немного необычно, поскольку цепочка отношений:

Container.root_item_id -> ItemRelationship.parent_item_id

Там нетявный ФК там.Я предполагаю, что мне нужно каким-то образом использовать метод «Где», но я не уверен, как - не смог найти примеры.Есть идеи?

1 Ответ

0 голосов
/ 31 июля 2009

Я думаю, что ваша проблема может быть решена с помощью сравнительно простого удобного свойства; Дайте мне посмотреть, если у меня есть это право:

У вас есть отношение "многие ко многим" между элементами (поддерживается в таблице ItemRelationship). Поэтому по умолчанию вы должны иметь возможность определить класс Item со свойством для него для ChildItems (для этого в вашем ClassMap будет вызов HasManyToMany ()). Ваш класс Container будет иметь свойство Root_Item типа Item (которое, как только что упомянуто, имеет список ChildItems). Затем вы можете создать вспомогательное свойство для Container, которое возвращает ChildItems его Root_item. например:

public class Container
{
    public virtual Item Root_Item { get; set; }

    public List<Item> ChildItems
    {
        get {
            if (Root_Item != null)
                 return Root_Item.ChildItems;
            return new List<Item>(); // or null depending on how you want to handle this
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...