質問

nHibernateでエラーが発生しています:カスタムタイプはUserCollectionTypeを実装していません:myApp.Domain.OrderLineCollection。

BindingListはIListを実装しているのに、なぜnHibernateはIListの代わりにUserCollectionTypeを使用しようとしているのですか?

public class OrderHeader
{
    public virtual int OrderHeaderId { get; set; }
    public virtual string OrderNumber { get; set; }
    public virtual OrderLineCollection Line { get; set; }
}

public class OrderLineCollection : BindingList<OrderHeader> { }

public class OrderHeaderMap : ClassMap<OrderHeader>
{
    public OrderHeaderMap()
    {
        WithTable("Orders");
        Id(x => x.OrderHeaderId, "OrderId").GeneratedBy.Identity();
        Map(x => x.OrderNumber);
        HasMany(x => x.Line).WithKeyColumn("OrderHeaderId").AsList();
    }
}

<list name="Line">
  <key column="OrderHeaderId" /> 
  <index /> 
  <one-to-many class="myApp.Domain.OrderLine, myApp.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</list>
役に立ちましたか?

解決

NHibernateには、下にIListを実装する独自の型付きリストがあります。
nHibernate UserTypeを作成せずにあなたのものを使用することはできないと思います。

しかし、私は間違っている可能性があり、その理由を聞いて喜んでいるでしょう。 :)

他のヒント

fluentNHibernateによって作成されたXMLを確認する必要がある場合があります-Lineプロパティのタイプを取得して明示的に設定する可能性が高いです。

これは、タイプを明示的に設定しなくても機能します。 IListから派生したカスタムコレクションを実装しようとしましたが、バッグ/リストで型を指定しなくてもマッピングで機能しました。

OK、 Arnis L。の簡単なテストを行いました。おそらく、UserCollectionTypeを実装しないと動作しません。私の経験では、を実装するのは苦痛です。

(どういうわけか、このようなことをしていたのを覚えていたが、私の心が私をだましていると思う)

NHibernateのソースコードを見ると、少なくともPersistentBagとPersistentListの場合、NHibernateはArrayListオブジェクトを、考えられるOrderLineCollectionではなく、バックエンドリストとしてインスタンス化します。 IUserColletionTypeを実装すると、NHibernateに作成するコレクションと、Hibernateがsavに使用する永続コレクションを指示するメソッドがあります。 このリンクは大いに役立つかもしれません。しかし、私はまだBindingListでNhibernateの作業を行うことはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top