2011-09-20 41 views
0

這裏是映射:雙向one-to-很多NHibernate的

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="cs_nhibernate_test1" 
        namespace="cs_nhibernate_test1"> 

    <class name="User" table="users"> 
     <id name="Id" type="int"> 
     <column name="Id" not-null="true" /> 
     <generator class="native"/> 
     </id> 
     <property name="Name" column="Name" /> 
     <property name="Age" column="Age" />  
     <bag name="Posts" inverse="true" cascade="all"> 
     <key column="UserId" /> 
     <one-to-many class="Post" /> 
     </bag>  
    </class> 

    <class name="Post" table="posts"> 
     <id name="Id" type="int"> 
     <column name="Id" not-null="true" /> 
     <generator class="native"/> 
     </id> 
     <property name="Text" column="Text" /> 
     <many-to-one name="User" column="UserId" /> 
    </class> 

</hibernate-mapping> 

下面的代碼:

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int Age { get; set; } 
    public virtual IList<Post> Posts { get; set; } 

    public override string ToString() 
    { 
     return string.Format("User{{id={0}, name='{1}', age={2}}}", Id, Name, Age); 
    } 
} 

public class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual User User { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Post{{id={0}, text='{1}', user={2}}}", Id, Text, User); 
    } 
} 

    static void Main(string[] args) 
    { 
     ... 
     ISessionFactory sessionFactory = cfg.BuildSessionFactory(); 
     using (ISession session = sessionFactory.OpenSession()) 
     { 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 
       for (int i = 0; i < 3; ++i) 
       { 
        var user = new User 
        { 
         Name = string.Format("John Smith #{0}", i + 1), 
         Age = 25 + i, 
         Posts = new List<Post>() 
        }; 

        for (int j = 0; j < 3; ++j) 
        { 
         var post = new Post 
         { 
          Text = string.Format("qwerty {0} {1}", i, j) 
         }; 
         user.Posts.Add(post); 
        } 

        session.SaveOrUpdate(user); 
       } 
       transaction.Commit(); 
      } 

      foreach (User u in session.CreateCriteria(typeof (User)).List<User>()) 
      { 
       Console.WriteLine(u); 
       foreach (Post post in u.Posts) 
       { 
        // post.User is always null! 
        Console.WriteLine(" {0}", post); 
       } 
      } 

      foreach (Post p in session.CreateCriteria(typeof(Post)).List<Post>()) 
      { 
       // p.User is always null! 
       Console.WriteLine(p); 
      } 
     } 
    } 

Post.User總是null。已經花了3個小時。我錯在哪裏?

回答

1
  1. 你永遠不設置Post.User屬性和User.Posts收集逆,所以沒有提及將在數據庫(如果posts.UserId列將不爲空,你會得到在插入時出錯)創建。
  2. 您仍處於同一會話中,因此即使User.Posts集合不是相反的,Post.User屬性仍然爲空。 NHibernate不會在保存時修改對象(除了用自己的實現替換集合),並且條件返回剛剛保存的同一對象,因爲它們在會話緩存中。