エンティティをロードしようとすると、NHibernate.Collection.PersistentBag クラスでエラーが発生します。
値 "MyProject.DomainModel.Operator" は "MyProject.DomainModel.Operator" 型ではないため、この汎用コレクションでは使用できません。
両方の値の型がまったく同じであることに注意してください。比較ツールでそれらを再確認しました。
NHibernate は、行 bag.Add(element) で List コレクションに値を追加できません。
要素変数は、実際には *object{DecoratorAopProxy_9cf850624c7e4ef9a8e2d9694bed26fd}* 型です。このリストに正常に追加できるオブジェクトはobject{MyProject.DomainModel.Operator}型であることに気付きました。このタイプは、「タイプ」列の VS2012 の「クイック ウォッチ」機能から取得されます。
NHibernate がこの特定のオブジェクトの型をプロキシに変更し、他のオブジェクトは純粋なエンティティ型を持っている理由を知っている人はいますか?
<class name ="PersonRole" table ="tblPersonRole" mutable ="false">
<id name="Id" column="PersonRoleID" type="Int32" access ="nosetter.lowercase-underscore">
<generator class="native"/>
</id>
<discriminator formula="case when RoleID in (2,4,5,6) THEN RoleID ELSE 0 END" />
<subclass discriminator-value="4" name="AccountManagerRole">
<bag name="Operators" >
<key column="OperatorID"></key>
<one-to-many class="BaseOperator"/>
<loader query-ref="LoadAllocatedOperators_ACCOUNTMANAGER"/>
</bag>
</subclass>
</class>
<class name="BaseOperator" table="tblOperator" lazy="true" >
<id name="Id" column="OperatorID" access ="nosetter.lowercase-underscore" type="Int32" unsaved-value="null">
<generator class="native" />
</id>
<discriminator column="OperatorType" type="string" />
<subclass discriminator-value ="OPR" name ="Operator" lazy="true">
<bag name="Customers" access="nosetter.camelcase-underscore" lazy="true" cascade="all-delete-orphan" inverse="true" fetch="join" >
<key column="OperatorId" />
<one-to-many class="MyProject.DomainModel.Customer, MyProject" not-found="ignore" />
</bag>
<subclass discriminator-value ="OPR2" name ="Operator2" lazy="true" />
</subclass>
</class>
そのため、 「 AccountManagerRole accManager から個別の accManager を選択する」などの操作を行うと、ID を使用してオペレーターが一度に 1 つずつロードされ、NHibernate がそのうちの 1 つでクラッシュします。