您好我正在尝试使用XML映射在NHibernate中映射一对多的父子关系。如果父类实例将子集合存储在列表中,则很容易,但我想使用字典。有人能指出一个示例,说明如何在XML中设置此映射吗?
换句话说,我希望我的父类看起来像这样
公共课家长 {
IDictionary< string,Child>儿童; // key应为Child.Name
}
它是数据库中的标准主键 - 外键关系。 Child表具有Name列,该列应映射到字典键。
由于
答案 0 :(得分:4)
这当然是可能的。 Hibernate(不是NHibernate)文档很好地解释了这一点。 7.3.3. Bidirectional associations with indexed collections。 NHibernate错误跟踪器中存在一个问题,即更正了文档中的this error: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; }
}
<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.Name
和Parent.Children.Keys
将不同步。
答案 1 :(得分:-1)
Child.Name不能同时是属性和字典键。