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