NHibernate的。将1-many关系映射到字典

时间:2010-08-03 16:33:42

标签: nhibernate dictionary

您好我正在尝试使用XML映射在NHibernate中映射一对多的父子关系。如果父类实例将子集合存储在列表中,则很容易,但我想使用字典。有人能指出一个示例,说明如何在XML中设置此映射吗?

换句话说,我希望我的父类看起来像这样

公共课家长  {

IDictionary< string,Child>儿童; // key应为Child.Name

}

它是数据库中的标准主键 - 外键关系。 Child表具有Name列,该列应映射到字典键。

由于

2 个答案:

答案 0 :(得分:4)

这当然是可能的。 Hibernate(不是NHibernate)文档很好地解释了这一点。 7.3.3. Bidirectional associations with indexed collections。 NHibernate错误跟踪器中存在一个问题,即更正了文档中的this errorNH-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 Mappings

<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);

最终笔记

更改儿童姓名时要小心。我认为最好的方法是从Parent中删除Child,更改其名称,最后将其重新添加到父级。否则Child.NameParent.Children.Keys将不同步。

答案 1 :(得分:-1)

Child.Name不能同时是属性和字典键。