2011-03-25 68 views
0

我遇到了流利的nhibernate奇怪的錯誤。我有一組繼承自接口的基本類,並且我已將接口映射到表,並且類使用這些接口,它們實現了接口的一般性。它們定義如下:流利的nHibernate - 保存一些接口,而不是其他人

interface IPage { 
    // properties 
} 

class IPageMap : ClassMap<IPage> { 
// mapping information 
} 

class Page : IPage { 
// IPage Implementation 
} 

class ITag { 
    // properties 
} 

class ITagMap : ClassMap<ITag> { 
    // mapping information 
} 

class Tag : ITag { 
    // ITag implementation 
} 

class Template { 
    virtual IList<IPage> Pages { get; set; } 
    virtual IList<ITag> Tags { get; set; } 
} 

這應該很好。當我創建這樣一個對象時...

var pages = new List<IPage> { 
    new Page { 
    // .. 
    } 
} 

pages.ForEach(x => { session.SaveOrUpdate(x); }); // no exception here 

var tags = new List<ITag> { 
    new Tag { 
    // ... 
    } 
} 

tags.ForEach(x => { session.SaveOrUpdate(x); }); // exception happens here. 

var list = new List<Template> { 
    new Template { 
    Pages = new List<IPage> { 
     new Page { 
      // ... 
     } 
    }, 
    Tags = new List<ITag> { 
     new Tag { 
      // .. 
     } 
    } 
    } 
} 

我給出以下例外。

沒有爲Tag

好了沒有留存,我並沒有定義爲的持留Tag,但我爲ITag,並Tag繼承它。 IPagePage的工作方式相同。如果我註釋掉標籤信息,並且只保留IPagePage實現,那麼對於這些​​標籤信息工作正常。

爲什麼ITagTag被區別對待?有任何想法嗎?

回答

2

您需要將Tag作爲ITag的子類別映射。每個持久化類型需要單獨映射,您需要告訴NH子類的成員將要去哪裏(即使沒有任何),更重要的是當從數據庫中讀取數據時,哪些具體類型NH應該實例化。

+0

好的,這很好 - 但爲什麼我不必用'Page'來做?我沒有把它映射成一個sublcass,它仍然有效。 – Ciel 2011-03-25 14:18:04

+1

我看不出它在這裏告訴我的任何區別。其他地方一定有區別。 – 2011-03-25 14:20:05

+0

是的,因此我完全混淆。 e.e – Ciel 2011-03-25 14:34:51