NHibernate / Fluent的一对一映射问题:外键未更新

时间:2010-06-03 13:36:01

标签: c# .net nhibernate fluent-nhibernate nhibernate-mapping

摘要:父级和子级。父母与子女之间的一对一关系。 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'似乎被忽略 - 如果事实我可以设置任何值(甚至是一个不存在的字段)并且不会发生错误 - 连接总是失败并且不返回子项。

我在上面尝试过一些细微的变化。看起来它应该是一件简单的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您要将同一列映射两次,这是不允许的。从父类中删除以下内容

Map(x => x.ChildId);

另见 IndexOutOfRangeException Deep in the bowels of NHibernate