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.PersistentGenericBag1 1[Kctc.BusinessLayer.ProbateAssist.Entities.Contact]' to type 'Iesi.Collections.Generic.ISet[Kctc.BusinessLayer.ProbateAssist.Entities.Contact]'のオブジェクトをキャストできません。

何が得られますか?コレクションの公開バージョンを読み取り専用にするにはどうすればよいですか?

注意:ReadOnlyCollectionも使用しようとしましたが、同じエラーが発生します。

4

1 に答える 1

1

Fluent自動マッピングを使用している可能性があります。これは、インターフェイスタイプに基づいて、タイプをSetではなくBagとして推測します。その場合はオーバーライドする必要があります。

IEnumerable<T>手動またはXMLでマッピングする場合は正常に機能します。

于 2010-10-27T02:16:49.353 に答える