1

我很新的NHibernate。通過代碼NHibernate映射 - 多對多 - 雙向導航

我有許多映射工作。他們是這樣的:

public abstract class EntityMapping<T> : ClassMapping<T> where T : Entity 
{ 
    public EntityMapping() 
    { 
     Id(x => x.Id, map => map.Generator(new IdentityGeneratorDef())); 
    } 
} 

    public class PersonMapping : EntityMapping<Person> 
    { 
     public PersonMapping() 
     { 
      Property(x => x.Name); 
     } 
    } 

    public class ParentMapping : JoinedSubclassMapping<Parent> 
     { 
      public ParentMapping() 
      { 
       Property(x => x.ParentOf); 
       Key(x => x.Column("ParentId")); 

       Bag(x => x.Children, map => 
             { 
              map.Cascade(Cascade.All); 
              map.Table("ParentChildren"); 
              map.Key(x => x.Column("ParentId")); 
             }, 
             r => r.ManyToMany(rm => rm.Column("ChildId"))); 
      } 
     } 

     public class ChildMapping : JoinedSubclassMapping<Child> 
     { 
      public ChildMapping() 
      { 
       Property(x => x.Toys); 
       Key(x => x.Column("ChildId")); 

       Bag(x => x.Parents, map => 
       { 
        map.Cascade(Cascade.All); 
        map.Table("ParentChildren"); 
        map.Inverse(true); 
        map.Key(x => x.Column("ChildId")); 
       }, 
       r=>r.ManyToMany(rm => rm.Column("ParentId"))); 
      } 
     } 

當我做

var parent = session.Get<Parent>(1); 
parent.Children.First(); // Works 

我可以訪問已添加的孩子。但是,當我嘗試導航時,即:

var child = session.Get<Child>(2); 
child.Parents.First(); // Doesn't work. 

子對象上的父集合是空的。

有人能夠解釋這個問題嗎?

乾杯,

詹姆斯

編輯

對不起,我用下面的代碼保存並讓我的實體:

using(var session = _sessionFactory.OpenSession()) 
{ 
    using(var transaction = session.BeginTransaction()) 
    { 
     var person = new Parent(){Name = "James", ParentOf = 1}; 
     var child = new Child(){ Name="James Jr." Toys = 20 }; 

     person.Children.Add(child); 

     session.Save(person); 
     transaction.Commit(); 
    } 
} 

檢索數據:

using(var session = _sessionFactory.OpenSession()) 
{ 
    using(var transaction = session.BeginTransaction()) 
    { 
     var james = session.Get<Parent>(1); 
     var child = session.Get<Child>(2);   

     transaction.Commit(); 
    } 
} 

我是否需要在交易中包裝get?

乾杯,

詹姆斯

+0

向我們展示用於保存和讀取關係以及會話/事務邊界的完整代碼。 – NOtherDev 2012-03-23 17:19:23

回答

0

抱歉,我是一個傻瓜,

我又寫了相同的代碼,發現我有得到,在相同的事務提交(後session.save和transaction.commit前)

感謝您的幫助!