2010-09-03 43 views
7

我有一個包含父對象的ID的子表。這是一對一映射,但子表可能缺少值。我有問題但沒有得到一個錯誤,但我已經嘗試了幾件事情;映射同一列中,具有不同的特性等。在fluentnhibernate中使用引用作爲ID

 
Parent table 
    int id 

Child table 
    int parentid 

Parent class 
    int id 

Child class 
    Parent parent // note I'm referencing parent, not using an int id.. 

映射

Id(x => x.Parent) 
    .Column("parentid"); // fails 

Id(x => x.Parent.Id) 
    .Column("parentid"); // fails 

References(x => x.Parent) 
    .Column("parentid"); // fails - missing id 

// Adding an id field in addition to parent for 
// child class (id is then the same as parent.id) 
// fails on save 
Id(x => x.Id) 
    .Column("parentid"); 
References(x => x.Parent) 
    .Column("parentid"); 

我想子類不具有明顯的Id字段,而是僅一個,因爲可以向父參考絕不是沒有父母的孩子。但是,在數據庫中,我只想存儲父級的ID。

任何想法我可能會這樣做?

回答

5

以下工作:

Id(x => x.Parent.Id).Column("MemberID"); 
References(x => x.Parent).Column("MemberID").ReadOnly(); 

只讀爲參考,重要的是沒有得到一個異常

編輯:沒那麼簡單......

我的子類仍然有被調用的Id屬性。似乎Parent.Id的Id引用混淆了nhibernate,而是嘗試調用child.Id。 我向孩子添加了以下內容,現在它似乎能夠正常工作。雖然這是一個非常難看的黑客攻擊。

public virtual int Id { 
    get { return Parent.Id; } 
    set { Debug.Assert(value == Parent.Id); } 
} 
+0

+1爲我工作在這裏,但還有一個更優雅的方式來做到這一點? – 2014-04-04 17:01:38

0

FluentNHibernate的API已經改變多年來,所以我不知道這句法是可用的,當這個問題最初是問,但你現在可以使用的引用作爲一個id,如果你映射它作爲一個複合的ID。我不會稱之爲黑客攻擊,但有點奇怪,您必須將引用映射到父實體,作爲組合ID的一部分。這裏有一個完整的例子:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     Table("StackOverflowExamples.dbo.Parent"); 

     Id(x => x.ParentId); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 

public class OnlyChildOfParentMap : ClassMap<OnlyChildOfParent> 
{ 
    public OnlyChildOfParentMap() 
    { 
     Table("StackOverflowExamples.dbo.OnlyChildOfParent"); 

     CompositeId().KeyReference(x => x.Parent, "ParentId"); 
     Map(x => x.SomeStuff); 
     Map(x => x.SomeOtherStuff); 
    } 
} 

public class Parent 
{ 
    public virtual int ParentId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class OnlyChildOfParent 
{ 
    public virtual Parent Parent { get; set; } 
    public virtual string SomeStuff { get; set; } 
    public virtual string SomeOtherStuff { get; set; } 

    #region Overrides 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
      return false; 

     var child = obj as OnlyChildOfParent; 

     if (child != null && child.Parent != null) 
     { 
      return child.Parent.ParentId == Parent.ParentId; 
     } 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return Parent.ParentId; 
    } 

    #endregion Overrides 
} 
0

也許this後可以幫助。
我已使用註釋.Cascade.SaveUpdate()
我的情況是與父把註釋兩側

觀測數據一hasone:語言PT-BR

+0

如果您可以翻譯相關答案的相關部分,這將有所幫助...... – 2015-09-17 14:48:17