2012-03-28 78 views
0

我想模擬一個父類/子關聯,其中一個父類(Person)擁有一個子類(OwnedThing)的許多實例 - 我想在Person類是自動保存的OwnedThing實例保存下來,我希望該協會是雙向的。NHibernate雙向關聯

public class Person 
{ 
     public class MAP_Person : ClassMap<Person> 
     { 
       public MAP_Person() 
       { 
         this.Table("People"); 
         this.Id(x => x.ID).GeneratedBy.GuidComb().Access.BackingField(); 
         this.Map(x => x.FirstName); 
         this.HasMany(x => x.OwnedThings).Cascade.AllDeleteOrphan().KeyColumn("OwnerID").Inverse(); 
       } 
     } 

     public virtual Guid ID { get; private set; } 
     public virtual string FirstName { get; set; } 
     public virtual IList<OwnedThing> OwnedThings { get; set; } 

     public Person() 
     { 
       OwnedThings = new List<OwnedThing>(); 
     } 
} 



public class OwnedThing 
{ 
     public class MAP_OwnedThing : ClassMap<OwnedThing> 
     { 
       public MAP_OwnedThing() 
       { 
         this.Table("OwnedThings"); 
         this.Id(x => x.ID).GeneratedBy.GuidComb().Access.BackingField(); 
         this.Map(x => x.Name); 
         this.References(x => x.Owner).Column("OwnerID").Access.BackingField(); 
       } 
     } 

     public virtual Guid ID { get; private set; } 
     public virtual Person Owner { get; private set; } 
     public virtual string Name { get; set; } 
} 

如果我設置Person.OwnedThings反演那麼OwnedThing情況下不會被保存,當我救的人。如果我不添加逆,那麼保存成功,但是person.OwnedThings [0] .Owner在從數據庫中檢索到後始終爲空。

UPDATE 在保存數據的NHibernate將設置一個關聯端的數據庫,因爲它是通過該協會的許多高端設置,所以當我從它確實數據庫檢索OwnedThing有鏈接回人員組。我的空引用來自Envers,似乎並沒有做同樣的事情。

回答

0

我是否正確理解你的問題只發生在由nhibernate envers讀取的「歷史」實體上?

如果是的話,它可能會受到此問題的 https://nhibernate.jira.com/browse/NHE-64 解決辦法,現在是使用合併,而不是(SaveOr)更新造成的。

0

OwnedThings[0].Owner很可能爲空,因爲您在添加時未設置它。當使用雙向關係中,你必須做類似下面:

Person person = new Person(); 
OwnedThing pwnedThing = new OwnedThing(); 

pwnedThing.Owner = person; 
person.OwnedThings.Add(pwnedThing); 

如果不明確地設置pwnedThing.Owner和您查詢的是,在同一個ISession同一個對象,你創建它就會爲空。通常我會添加或刪除爲我做這個「額外」工作的方法。以下例子:

public class Order : Entity 
{ 
    private IList<OrderLine> orderLines; 
    public virtual IEnumerable<OrderLine> OrderLines { get { return orderLines.Select(x => x); } } 

    public virtual void AddLine(OrderLine orderLine) 
    { 
     orderLine.Order = this; 
     this.orderLines.Add(orderLine); 
    } 

    public virtual void RemoveLine(OrderLine orderLine) 
    { 
     this.orderLines.Remove(orderLine); 
    } 
} 

public class OrderMap : ClassMap<Order> 
{ 
    public OrderMap() 
    { 
     DynamicUpdate(); 
     Table("ORDER_HEADER"); 
     Id(x => x.Id, "ORDER_ID"); 

     HasMany(x => x.OrderLines) 
      .Access.CamelCaseField() 
      .KeyColumn("ORDER_ID") 
      .Inverse() 
      .Cascade.AllDeleteOrphan(); 
    } 
}