【问题标题】:NHibernate: use of IEnumerable as collection type results in errorNHibernate:使用 IEnumerable 作为集合类型会导致错误
【发布时间】:2010-10-26 21:15:55
【问题描述】:

我有一个使用 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.PersistentGenericBag1[Kctc.BusinessLayer.ProbateAssist.Entities.Contact]' to type 'Iesi.Collections.Generic.ISet1[Kctc.BusinessLayer.ProbateAssist.Entities.Contact]”的对象。

什么给了?如何将集合的公开版本设为只读?

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

【问题讨论】:

  • 你应该展示你的 nhibernate 配置文件是什么样的(或者如果你使用 FluentNhibernate,你的 fluent 配置是什么)

标签: nhibernate set readonly-collection


【解决方案1】:

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

IEnumerable&lt;T&gt; 在手动映射或使用 XML 时工作正常。

【讨论】:

  • 太棒了!我永远不会猜到这是一个映射问题。谢谢。
  • 为了后代,我通过将 .AsSet() 添加到客户端映射文件中联系人集合的 HasMany 行末尾来解决此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多