1

我有一个使用 ISet 作为集合类型的类,如下所示:

  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.ISet1 [Kctc.BusinessLayer.ProbateAssist.Entities.Contact]”的对象。

是什么赋予了?如何使该集合的公共版本为只读?

注意我也尝试使用 ReadOnlyCollection,并得到同样的错误。

4

1 回答 1

1

您可能正在使用 Fluent 自动映射,它根据接口类型猜测类型为 Bag 而不是 Set。在这种情况下,您必须覆盖它。

IEnumerable<T>手动映射或使用 XML 映射时工作正常。

于 2010-10-27T02:16:49.353 回答