繁体   English   中英

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

[英]One-to-one Mapping issue with NHibernate/Fluent: Foreign Key not updateing

简介:父母和孩子班。 父母与子女之间一对一的关系。 父级具有FK属性,该属性引用子级的主键。 代码如下:

  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无效,计数为3”

如果我按如下方式更改父级“参考”行(即提供我指向的子级属性的名称):

References(x => x.ChildRef, "ChildId").PropertyRef("NHTestChildId").Cascade.All();

我收到错误消息:“无法解析属性:NHTestChildId”因此,我尝试了“ HasOne()”引用设置,如下所示:

HasOne<NHTestChild>(x => x.ChildRef).ForeignKey("ChildId").Cascade.All().Fetch.Join();

在这种安排下,保存工作正常(并且db中的数据是所需的),但是加载无法找到子实体。 检查SQL Nhibernate产生的SQL显示,NHibernate假设父级的主键是到子级的链接(即,加载连接条件为“ parent.NHTestParentId = child.NHTestChildId”)。我指定的'ForeignKey'似乎被忽略了-如果事实上我可以设置任何值(甚至是不存在的字段)并且没有错误发生-联接总是失败并且没有子级返回。

我在上面尝试了一些细微的变化。 看起来应该很简单。 有任何想法吗?

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

Map(x => x.ChildId);

参见IndexOutOfRangeException在NHibernate的深处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM