摘要:父類和子類。父母與子女之間的一對一關係。父母具有引用兒童主鍵的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'似乎被忽略 - 如果事實我可以設置任何值(即使是一個非存在的領域),並沒有發生錯誤 - 加入只是總是失敗,並沒有孩子返回。
我已經嘗試了一些上述輕微變化。像它應該是一個簡單的事情來實現的。任何想法?
謝謝。這正是問題所在。 經過半天的嘗試我可以想到的映射的每一個變化,它歸結爲刪除一行代碼。 可惜NHibernate(或Fluent)不能識別列的雙映射並拋出一個(有意義的)錯誤。 – Trevor 2010-06-04 06:27:12