Это, конечно, возможно.Документация 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
будут не синхронизированы.