0

インターセプターを使用して NHibernate 3.3 エンティティで DI を実行しようとしています。

私のコードは次のとおりです。

public override object Instantiate( string clazz, EntityMode entityMode, object id ) {
    if( entityMode == EntityMode.Poco ) {

        dynamic x = _mappings.RootClasses.FirstOrDefault( hc => hc.Name.StartsWith( clazz ) );
        if( x == null )
            x = _mappings.SubClasses.FirstOrDefault( sc => sc.Name.StartsWith( clazz ) );
        if( x == null )
            x = _mappings.UnionSubclasses.FirstOrDefault( usc => usc.Name.StartsWith( clazz ) );

            if( x != null ) {
            Type type = Type.GetType( x.Name );  //Assembly.GetAssembly( typeof( Person ) ).GetTypes().FirstOrDefault( x => x.FullName == clazz );
            if( type != null ) {
                if( _kernel.HasComponent( type ) ) {
                    object instance = _kernel.Resolve( type );
                    _session
                        .SessionFactory
                        .GetClassMetadata( clazz )
                        .SetIdentifier( instance, id, entityMode );
                    return instance;
                }
            }
        }
    }
    return base.Instantiate( clazz, entityMode, id );
}

返されるインスタンスに問題はありません。ウォッチ ウィンドウ内で Id が適切に設定されていることを確認できます。

しかし、オブジェクトを覗き込まずにそのままにしておくとすぐに、次の例外が発生します: 間違ったタイプの ID が提供されました。想定: System.Int32、UtenteProxy を取得

次の呼び出しでも同じ例外が発生します: _session.CreateCriteria().List();

何を探すべきかについてのヒントはありますか?

4

1 に答える 1

0

さて、一晩寝た後、解決策を見つけました。インターセプターによってインスタンス化されるクラスは、Lazy=false と宣言する必要があります。

このように NHibernate はプロキシを予期せず、すべて正常に動作します。

于 2013-03-07T06:41:17.123 に答える