2011-06-22 9 views
7

私はプロパティマッピングは、このようなものである私のエンティティの1城下町:城。プロキシー。 <EntityName> NHibernateでプロキシと遅延= "true"?

のプロパティの遅延ロードを使用しようとしています。(使用してしかし、私は、このエンティティのインスタンスを保存するためにトリングていたときに

<property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/> 

LINQの)、それは以下の内部例外でDatabaseQueryExceptionをスローしません: "私は怠け者を削除すると=

をそして" Castle.Proxies.FooEntityProxy:

NHibernate.MappingException:用ませ存続をtrue "の場合、例外はスローされません。 lazy = "true"を使用する際の問題は何ですか?これを修正する方法は?

+0

を、あなたのセッションでそのプロパティに何が起こりましたそれはロードされているかどうか?あなたはセッションでそれを修正しましたか? –

+0

NH2 Ou NH3ですか? – Pedro

+0

@Pedroアセンブリバージョンは3.1 –

答えて

2

あなたはプロパティをマークすると怠惰なので、は仮想自動でなければなりませんプロパティ(ボディはpublic virtual MyType Baz { get; set; }など)。プロパティを通過するのではなく、基になるフィールド値にアクセスしようとすると、プロパティの遅延読み込みを回避し、予期しない結果が生じる可能性があります。

+1

仮想自動プロパティとは何ですか? –

+1

ボディのない仮想プロパティ。 'public virtual SomeType Foo {get;セット; } ' –

4

私はこれが遅い答えであることを知っていますが、これと同じ問題が以前に発生しました。私はプロキシを作成するためにカスタムインターセプタを使用していたので、問題は "GetEntityName"メソッドをオーバーライドしていないことがわかりました。 GetEntityNameメソッド内のプロキシを分析し、適切なクラス名を返すことがそのトリックでした。この方法の私の全体の実装がこのように見えたので

は、私の場合、私は、「UnProxy」と呼ばれ、私のオブジェクトをunproxyするための簡単な拡張メソッドを持っていた:

public override string GetEntityName(object entity) 
{ 
    if (entity == null) 
     return base.GetEntityName(entity); 
    return entity.UnProxy().GetType().FullName; 
} 
関連する問題