2010-10-26 34 views
1

我有一種使用的ISet作爲一個集合類型,如下一類:NHibernate的:使用的IEnumerable作爲集合類型導致錯誤

public class Client 
    { 
    private ISet<Contact> _contacts = new HashedSet<Contact>(); 
    public virtual ISet<Contact> Contacts { get { return _contacts; } } 
    } 

我不想集合本身能夠被修改外部。不過,如果我更改屬性的類型的IEnumerable如下:

public class Client 
    { 
    private ISet<Contact> _contacts = new HashedSet<Contact>(); 
    public virtual IEnumerable<Contact> Contacts { get { return _contacts; } } 
    } 

然後每當我嘗試使用這個類,我得到了NHibernate的錯誤:

System.InvalidCastException:無法投類型的對象NHibernate的.Collection.Generic.PersistentGenericBag 1[Kctc.BusinessLayer.ProbateAssist.Entities.Contact]' to type 'Iesi.Collections.Generic.ISet 1 [Kctc.BusinessLayer.ProbateAssist.Entities.Contact]'。

什麼給?我怎樣才能使集合的公開版本只讀?

NB我也試過使用ReadOnlyCollection,並得到相同的錯誤。

+1

你應該顯示你的nhibernate配置文件的樣子(或者如果你使用FluentNhibernate,你的流暢配置是什麼) – samy 2010-10-26 21:22:08

回答

1

您可能正在使用Fluent automapping,根據接口類型猜測類型爲Bag而不是Set。在這種情況下,你必須重寫它。

IEnumerable<T>在手動映射或使用XML進行映射時工作正常。

+0

太棒了!我永遠不會猜到這是一個映射問題。謝謝。 – David 2010-10-27 07:58:50

+0

對於後代,我通過將.AsSet()添加到客戶端映射文件中Contacts集合的HasMany行的末尾來解決了此問題。 – David 2010-10-27 07:59:44

相關問題