2012-03-28 4 views
0

Ich versuche, eine Eltern/Kind-Assoziation zu modellieren, wo eine Elternklasse (Person) viele Instanzen einer Kindklasse besitzt (OwnedThing) - Ich möchte, dass die OwnedThing-Instanzen automatisch gespeichert werden, wenn die Person-Klasse ist gespeichert, und ich möchte, dass die Assoziation bidirektional ist.NHibernate bidirektionale Assoziation

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

Wenn ich Person.OwnedThings eingestellt dann Inverse die OwnedThing Instanzen werden nicht gespeichert, wenn ich die Person zu speichern. Wenn ich Inverse nicht hinzufüge, ist das Speichern erfolgreich, aber person.OwnedThings [0] .Owner ist immer Null, nachdem ich es aus der DB abgerufen habe.

UPDATE Wenn die Daten NHibernate Speicher der einzelnen Assoziationsende in der Datenbank festgelegt, da es über das viel Ende des Vereins festgelegt ist, so dass, wenn ich den OwnedThing aus der DB abrufen es tut haben die Link zurück zum Personensatz. Mein NULL-Verweis stammte von Envers, der das nicht zu tun scheint.

Antwort

0

Bin ich verstehen Sie richtig, dass Ihr Problem nur auftreten, auf „Geschichte“ Entitäten lesen von nhibernate envers?

Wenn ja, könnte es jetzt https://nhibernate.jira.com/browse/NHE-64 Die Abhilfe von diesem Fehler verursacht wurde anstelle von (SaveOr) Update verwenden Merge.

0

OwnedThings[0].Owner ist wahrscheinlich Null, weil Sie es nicht festlegen, wenn Sie das Addieren durchführen. Wenn die bidirektionale Beziehungen verwenden, haben Sie so etwas wie die unten zu tun:

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

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

Wenn Sie nicht explizit die pwnedThing.Owner gesetzt und Sie fragen das gleiche Objekt in der gleichen ISession, dass Sie es auf sie erstellt null sein wird. Normalerweise habe ich Methoden hinzufügen oder entfernen, die diese "extra" Arbeit für mich tun. Nehmen Sie das folgende Beispiel:

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