2012-03-12 53 views
1
[Test] 
public void Artist_gets_stored_properly() 
{ 
    using (ISession session = NHHelper.GetSession()) 
    { 
     Artist artist = new Artist() { Name = "Somathilaka Jayamaha" }; 

     artist.Songs = new List<Song>() 
     { 
      new Song(){Artist = artist, Name = "Manamaala girawu"}, 
      new Song(){Artist = artist, Name = "Sende andura"}, 
      new Song(){Artist = artist, Name = "Sunilwan nuwan"} 
     }; 

     foreach (var s in artist.Songs) 
     { 
      session.Save(s); 
     } 
     session.Save(artist); 
    } 

    using (ISession session = NHHelper.GetSession()) 
    { 
     Artist artist = session.Query<Artist>().Single(x => x.Name == "Somathilaka Jayamaha"); 
     Assert.AreEqual(3, artist.Songs.Count); 
     Assert.AreEqual("Sende andura", artist.Songs[1].Name); 
    } 
} 

public class Artist 
    { 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual IList<Song> Songs { get; set; } 
    } 

    public class Song 
    { 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string WebPath { get; set; } 
     public virtual string FilePath { get; set; } 
     public virtual bool Downloaded { get; set; } 
     public virtual Artist Artist { get; set; } 

     void Download(IDownloader downloader) 
     { 
     } 
    } 

我有上面的測試用例,它在這一行失敗:Assert.AreEqual(3, artist.Songs.Count);。歌曲似乎沒有得到保存。我使用自動映射,並在映射覆蓋的集合字段中使用Cascade.All()並關閉延遲。我不明白爲什麼這個測試失敗。正如你所看到的,我手動保存了3首歌曲,儘管據我所知,當Cascade.All()Artist.Songs字段時,我不需要這樣做。有人能告訴我我做錯了什麼嗎?謝謝。在數據庫中沒有正確保存的對象

MS SQLServer的2005,.NET 3.5,FluentNHibernate 1.2.0.712

+0

什麼是你的刷新模式設置爲? 'FlushMode。?' – Rippo 2012-03-12 08:12:43

+0

另外你如何處理交易? – Rippo 2012-03-12 08:29:28

回答

3

你沒有使用一個事務,你永遠不會刷新會話。

你所得到的插入的唯一原因是因爲你使用的是identity發生器,當你調用Save(這是一個限制,而不是功能)的插入。

正確的方法,以這樣的:

using (ISession session = NHHelper.GetSession()) 
using (var transaction = session.BeginTransaction()) 
{ 
    Artist artist = new Artist { Name = "Somathilaka Jayamaha" }; 

    artist.Songs = new List<Song>() 
    { 
     new Song{Artist = artist, Name = "Manamaala girawu"}, 
     new Song{Artist = artist, Name = "Sende andura"}, 
     new Song{Artist = artist, Name = "Sunilwan nuwan"} 
    }; 

    session.Save(artist); 
    transaction.Commit(); 
} 
+1

確實;一些有趣的內容:http://stackoverflow.com/questions/43320/nhibernate-isession-flush-where-and-when-to-use-it-and-why – 2012-03-12 12:43:49

相關問題