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前)

感谢您的帮助!