2010-06-03 210 views
0

摘要:父類和子類。父母與子女之間的一對一關係。父母具有引用兒童主鍵的FK屬性。代碼如下:NHibernate/Fluent的一對一映射問題:外鍵不更新

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; } 
    } 

用下面流利的映射:

父映射

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; 

...我得到一個錯誤:「無效索引3對本SqlParameterCollection與計數= 3」

如果我改變父「引用」行,如下所示(即提供我指着)子屬性的名稱:

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

我得到的錯誤:「無法解析屬性:NHTestChildId」 於是,我嘗試了「HasOne()」基準設置,如下:

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

在這種結構中保存作品(和數據在數據庫被通緝),但加載失敗找孩子的實體。檢查SQL Nhibernate生成顯示我NHibernate假設父鍵的主鍵是子鏈接(即負載連接條件是「parent.NHTestParentId = child.NHTestChildId)。我指定的'ForeignKey'似乎被忽略 - 如果事實我可以設置任何值(即使是一個非存在的領域),並沒有發生錯誤 - 加入只是總是失敗,並沒有孩子返回。

我已經嘗試了一些上述輕微變化。像它應該是一個簡單的事情來實現的。任何想法?

回答

2

你映射同一列兩次,這是不允許的。刪除從父類中的下列

Map(x => x.ChildId); 

另請參閱 IndexOutOfRangeException Deep in the bowels of NHibernate

+0

謝謝。這正是問題所在。 經過半天的嘗試我可以想到的映射的每一個變化,它歸結爲刪除一行代碼。 可惜NHibernate(或Fluent)不能識別列的雙映射並拋出一個(有意義的)錯誤。 – Trevor 2010-06-04 06:27:12