NHibernate. Карта 1-много отношение к словарю - PullRequest
0 голосов
/ 03 августа 2010

Привет. Я пытаюсь отобразить отношения «один-многие родители-потомки» в NHibernate, используя сопоставление XML.Достаточно просто, если экземпляры родительского класса хранят коллекцию детей в списке, но я хочу использовать словарь.Может кто-нибудь указать мне на пример, который показывает, как настроить это отображение в XML?

Другими словами, я хочу, чтобы мой родительский класс выглядел так1006 * IDictionaryдети;// ключ должен быть Child.Name

}

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Это, конечно, возможно.Документация Hibernate (не NHibernate) хорошо объясняет это. 7.3.3.Двунаправленные ассоциации с индексированными коллекциями .В системе отслеживания ошибок NHibernate есть проблема с исправлением этой ошибки в документации: NH-3554

Ниже приведен полный пример того, как это сделать...

Пример

Классы сущностей

public class Parent
{
    public virtual int Id { get; private set; }

    private IDictionary<string, Child> _children = new Dictionary<string, Child>();
    public virtual IDictionary<string, Child> Children
    {
        get { return _children; }
        private set { _children = value; }
    }

    public virtual void AddChild(Child child)
    {
        child.Parent = this;
        _children[child.Name] = child;
    }
}

public class Child
{
    public virtual int Id { get; private set; }
    public virtual Parent Parent { get; protected internal set; }
    public virtual string Name { get; set; }
}

Отображения NHibernate

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="so" namespace="so.Q3398624">
  <class name="Parent">
    <id name="Id">
      <column name="Id" />
      <generator class="hilo" />
    </id>
    <map name="Children" inverse="true" cascade="all-delete-orphan">
      <key column="ParentId" />
      <index column="Name" type="string" />
      <one-to-many class="Child" />
    </map>
  </class>
  <class name="Child">
    <id name="Id">
      <column name="Id" />
      <generator class="hilo" />
    </id>
    <many-to-one name="Parent" column="ParentId" cascade="save-update" not-null="true" unique-key="U1" />
    <property name="Name" not-null="true" unique-key="U1" />
  </class>
</hibernate-mapping>

Таблицы

CREATE TABLE dbo.Parent (
    Id int NOT NULL PRIMARY KEY
);

CREATE TABLE dbo.Child (
    Id int NOT NULL PRIMARY KEY,
    ParentId int NOT NULL,
    Name nvarchar(255) NOT NULL,
    FOREIGN KEY (ParentId) REFERENCES dbo.Parent (Id),
    UNIQUE (ParentId, Name)
);

Вставить несколько записей...

var parent = new Parent();
parent.AddChild(new Child { Name = "abc" });
parent.AddChild(new Child { Name = "123" });

session.Save(parent);

Заключительные замечания

Будьте осторожны при изменении имени ребенка.Я думаю, что наилучшим подходом было бы удалить ребенка из родительского, изменить его имя и, наконец, повторно добавить его в родительский.В противном случае Child.Name и Parent.Children.Keys будут не синхронизированы.

0 голосов
/ 03 августа 2010

Child.Name не может быть одновременно свойством и ключом словаря.

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