1

NHibernate は、セッションが開いている間は PersistentGenericBag として表されるが、後でソース コードで定義した IList に変換されるコレクションを正確にいつ変換しますか?

トランザクションがコミットされたか、セッションが切断されたときだと思いました。しかし、私は単体テストを書いていますが、閉じたり、フラッシュしたり、コミットしたり、切断したりしても、オブジェクトには常にリストではなく PersistentGenericBag があります。

ありがとう

4

1 に答える 1

1

勘違いしないでくれ。しかし、本当にこのようなマッピングがありますか?

public class MyObject 
{
    public virtual List<string> MyColl { get; set; }
}

私の経験によると、これは次のような例外になります。

NHibernate.PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of MyLib.MyObject ---> System.InvalidCastException: Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericBag'1[System.String]' to type 'System.Collections.Generic.List1[System.String]`

あなたのマッピング内で私が期待するのはIList<>です。まさにこれにより、NHibernate が独自の実装を注入できるようになるからです。すなわち:PersistentGenericBag

public class MyObject 
{
    public virtual IList<string> MyColl { get; set; }
}

その場合、答えは: neverです。MyObjectのプロキシは、 IList<> によって発行されたすべての機能を提供しながら、タイプのプロパティを操作しますPersistentGenericBag

そして、実際に人口が集中するのはいつですか?(getter を介して) 最初にアクセスしたとき。の内部実装は、PersistentGenericBagSQL クエリを実行し、データを内部 IList<> にロードします。もちろん、セッションを開いて MyObject に接続する必要があります

于 2012-11-07T17:11:09.220 に答える