簡體   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