2012-03-28 7 views
0

親クラス(Person)が子クラス(OwnedThing)のインスタンスを多数所有している親子関係をモデル化しようとしています - 私はOwnedThingインスタンスをPersonクラスが保存され、私はその関連付けを双方向にしたい。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; } 
} 

私は人を救うときOwnedThingインスタンスが保存されていない、逆するPerson.OwnedThingsを設定した場合。 Inverseを追加しないと保存は成功しますが、person.OwnedThings [0] .OwnerはDBから取得した後は常にnullです。

UPDATE データを保存するとき、それが設定されているので、NHibernateのは、私がDBからOwnedThingを取得するときに、それはを持っています、関連の多くのエンドを経由してデータベース内の1つの関連端を設定します人物セットにリンクし直してください。私のnull参照は、同じことをしていないようなEnversからのものでした。

答えて

0

私はあなたの問題はNHibernateのenversによって読み取ら「歴史」の実体に発生することが正しくあなたを理解するだろうか?

もしそうなら、今の回避策は、(SaveOr)を更新するのではなく、Mergeを使用することでこのバグ https://nhibernate.jira.com/browse/NHE-64 によって引き起こされている可能性があります。

0

OwnedThings[0].Ownerは、追加時に設定していない可能性が高いため、おそらくnullです。あなたが明示的にpwnedThing.Ownerを設定しないと、あなたはそれでそれを作成したのと同じISession内の同じオブジェクトがnullになることを照会する場合

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

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

:双方向の関係を使用するときは、以下のような何かをしなければなりません。通常、私はこの "余分な"作業を行うメソッドを追加または削除しています。以下の例を見てみましょう:

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(); 
    } 
} 
関連する問題