2009-11-30 61 views
4

我無法弄清楚如何(或者如果它是在所有可能)使用功能NHibernate PersistenceSpecification<T>.CheckList(...)方法來檢查一個一對多映射。功能NHibernate - 單元測試一個一對多*逆*映射

這裏就是我想要做的事:

在香草博客/後例子使用功能NHibernate,我已經定義了一個一對多的博客< - >帖子映射。 我想要的一個限制是,一個帖子必須始終指向它所對應的博客,從它被添加到數據庫的那一刻開始。 (基本上,在文章表中的BlogID列是NOT NULL)

爲此,我定義像這樣的映射:

public class BlogMap: ClassMap<Blog> 
{ 
    public BlogMap(){ 
     [...] 
     HasMany(x => x.Posts) 
      .Inverse() 
      .Cascade.All(); 
} 

的博客類有一個AddPosts(IList<Post> posts)方法,該方法採用的兩側的護理該映射,所以當Post實例在數據庫中被插入時,其BlogID列已經填充了相應的Blog ID。

到目前爲止,這麼好。

的問題是,在一個映射單元測試使用

 new PersistenceSpecification<Blog>(GetSession(), eq) 
      .CheckList(c => c.Posts, 
         new [] {new Post{Name = "Post 1"}, new Post{Name = "Post 2"}}) 
      .VerifyTheMappings(); 

的時候,我得到這個異常:

「System.ApplicationException:實際計數不等於預期計數」

...這是預料之中的,因爲帖子的BlogID值沒有設置在任何地方。 我想知道如果我能以某種方式訪問​​PersistenceSpecification在幕後創建的Blog實例,所以我可以在執行檢查之前手動調用AddBlogs(...)方法。

如果我從映射中刪除.Inverse()(並且刪除BlogID列的數據庫NOT NULL約束),測試通過。

任何想法?

回答

7

我知道這已經在郵件列表中進行了整理,但我們也可能會在堆棧溢出問題上做出回答。

PersistenceSpecification類有一個CheckList方法。以下是一個示例用法:

_spec.CheckList(x => x.EnumerableOfKittens, kittens, (cat, kitten) => cat.AddKitten(kitten)); 

此方法僅在最近才添加。如果找不到它,請獲取最新的FNH中繼線。

+0

感謝您的提示! Offtopic:我喜歡SO!如果我在別處問過這個問題,我可能已經得到了最好的RTFM(郵件列表中的M :) 我看過其他ORM相關的項目(好吧,只有一個--SubSonic)只會在SO ,並且我認爲這對於SO來說是一個很好的(雖然意想不到的)新用法。 – 2009-12-05 08:44:22