2011-06-16 55 views
1

有沒有可用的工具,或者NHibernate中的實用方法,這可能會幫助我確定哪個映射拋出了「給定的鍵不存在於字典中」?NHibernate - 查找不良映射

我知道我必須有一個錯誤的映射,但我有數百個域對象。我能做些什麼來更快地找到我的錯誤來源?

從NHibernate的2.1.2GA來源:

private PersistentClass GetPersistentClass(string className) 
{ 
    PersistentClass pc = configuration.classes[className]; // <- "The given key was not present in the dictionary" 
    if (pc == null) 
    { 
    throw new MappingException("persistent class not known: " + className); 
    } 
    return pc; 
} 

在這種情況下,類名是System.Int32。

好吧,所以我有一個int域標記爲<many-to-one>而不是<property>。我最終挖掘了NH的源代碼並調試到了這一點。

+0

是有一個內部異常? – 2011-06-16 00:38:39

+0

對我來說,這次是在Configuration.BuildSessionFactory();沒有內在的例外。 – dwerner 2011-06-16 16:51:10

回答

6

NHibernate Mapping: Creating Sanity Checks

[Test] 
public void AllNHibernateMappingAreOkay() 
{ 
    IDictionary allClassMetadata = session.SessionFactory.GetAllClassMetadata(); 
    foreach (DictionaryEntry entry in allClassMetadata) 
    { 
     session 
      .CreateCriteria((Type) entry.Key) 
      .SetMaxResults(0) 
      .List(); 
    } 
} 
+0

感謝您的回答!當你的ISessionFactory已經被構建時,這很好,但是之前呢? – dwerner 2011-06-16 16:44:54

+0

如果沒有適當的Factory,您將無法對數據庫進行測試。 :) – rebelliard 2011-06-16 19:22:36

+0

+1的概念,但在實現我不得不使用var而不是IDictionary/DictionaryEntry,我不得不使用Type.GetType(entry.Key +「,My.Assembly」)而不是(Type)entry.Key 。此外,它沒有發現我的映射中導致丟失鍵信息的錯誤。 :) – Mayo 2011-08-03 21:28:34