摘要:父级和子级。父母与子女之间的一对一关系。 Parent具有FK属性,该属性引用Child的主键。代码如下:
public class NHTestParent
{
public virtual Guid NHTestParentId { get; set; }
public virtual Guid ChildId
{
get
{
return ChildRef.NHTestChildId;
}
set { }
}
public virtual string ParentName { get; set; }
protected NHTestChild _childRef;
public virtual NHTestChild ChildRef
{
get
{
if (_childRef == null)
_childRef = new NHTestChild();
return _childRef;
}
set
{
_childRef = value;
}
}
}
public class NHTestChild
{
public virtual Guid NHTestChildId { get; set; }
public virtual string ChildName { get; set; }
}
使用以下Fluent映射:
父映射
Id(x => x.NHTestParentId);
Map(x => x.ParentName);
Map(x => x.ChildId);
References(x => x.ChildRef, "ChildId").Cascade.All();
子映射:
Id(x => x.NHTestChildId);
Map(x => x.ChildName);
如果我做(伪代码)......
HTestParent parent = new NHTestParent();
parent.ParentName = "Parent 1";
parent.ChildRef.ChildName = "Child 1";
nhibernateSession.SaveOrUpdate(aParent);
Commit;
...我收到错误:“此SqlParameterCollection的索引3无效,且Count = 3”
如果我按如下方式更改父“引用”行(即提供我指向的子属性的名称):
References(x => x.ChildRef, "ChildId").PropertyRef("NHTestChildId").Cascade.All();
我收到错误:“无法解析属性:NHTestChildId” 所以,我尝试了'HasOne()'参考设置,如下所示:
HasOne<NHTestChild>(x => x.ChildRef).ForeignKey("ChildId").Cascade.All().Fetch.Join();
在这种安排中,save工作(db中的数据是所需的),但加载无法找到子实体。检查SQL Nhibernate生成向我显示NHibernate假设父级的主键是子级的链接(即加载连接条件是“parent.NHTestParentId = child.NHTestChildId”。我指定的'ForeignKey'似乎被忽略 - 如果事实我可以设置任何值(甚至是一个不存在的字段)并且不会发生错误 - 连接总是失败并且不返回子项。
我在上面尝试过一些细微的变化。看起来它应该是一件简单的事情。有什么想法吗?
答案 0 :(得分:2)
您要将同一列映射两次,这是不允许的。从父类中删除以下内容
Map(x => x.ChildId);
另见 IndexOutOfRangeException Deep in the bowels of NHibernate