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

NHibernate。将1-many关系映射到字典,nhibernate,dictionary,Nhibernate,Dictionary,嗨,我正在尝试使用XML映射来映射NHibernate中的一对多父子关系。如果父类实例将子类集合存储在一个列表中,那么就很容易了,但我想使用字典。有人能给我举个例子,说明如何用XML建立这种映射吗 换句话说,我希望我的父类看起来像这样 公共类父类 { IDictionary children;//键应为Child.Name } 它是数据库中的标准主键-外键关系。子表具有应映射到字典键的名称列 谢谢Child.Name不能既是属性又是字典键。Child.Name不能既是属性又是字典键。这当然是可能

嗨,我正在尝试使用XML映射来映射NHibernate中的一对多父子关系。如果父类实例将子类集合存储在一个列表中,那么就很容易了,但我想使用字典。有人能给我举个例子,说明如何用XML建立这种映射吗

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

公共类父类 {

IDictionary children;//键应为Child.Name

}

它是数据库中的标准主键-外键关系。子表具有应映射到字典键的名称列


谢谢

Child.Name不能既是属性又是字典键。

Child.Name不能既是属性又是字典键。

这当然是可能的。Hibernate(不是NHibernate)文档很好地解释了这一点。NHibernate bug tracker中有一个问题需要在文档中更正:

下面是一个完整的例子如何做到这一点

例子 实体类 插入一些记录。。。 最后说明
更改孩子的名字时要小心。我认为最好的方法是从父对象中删除子对象,更改其名称,最后将其重新添加到父对象中。否则
Child.Name
Parent.Children.Keys
将不同步。

这当然是可能的。Hibernate(不是NHibernate)文档很好地解释了这一点。NHibernate bug tracker中有一个问题需要在文档中更正:

下面是一个完整的例子如何做到这一点

例子 实体类 插入一些记录。。。 最后说明
更改孩子的名字时要小心。我认为最好的方法是从父对象中删除子对象,更改其名称,最后将其重新添加到父对象中。否则
Child.Name
Parent.Children.Keys
将不同步。

Hmm。Child.Name字段不会同时是同一类中的属性和键。它将是子类中的一个属性,也是父类中的一个键,因此在每个映射中只有一个角色。这有区别吗?我明白。但这仍然是错误的。您可以使其以只读方式工作,但在保存时会失败。相反,您可以将子对象映射为
,然后将其投影到客户端。好吧,这就足够了。谢谢你的回复!我不同意<代码>名称肯定可以在这两个地方使用。我已经运行了一些示例代码来验证这一点。看我的,嗯。Child.Name字段不能同时是同一类中的属性和键。它将是子类中的一个属性,也是父类中的一个键,因此在每个映射中只有一个角色。这有区别吗?我明白。但这仍然是错误的。您可以使其以只读方式工作,但在保存时会失败。相反,您可以将子对象映射为
,然后将其投影到客户端。好吧,这就足够了。谢谢你的回复!我不同意<代码>名称肯定可以在这两个地方使用。我已经运行了一些示例代码来验证这一点。看我的。我搜索的有点不同,但你的答案确实为我指明了正确的方向!我搜索的内容有点不同,但你的回答确实为我指明了正确的方向!谢谢
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; }
}
<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);