0

最近、少し前に書いたSOAPWebサービスでパフォーマンスの問題が発生しました。たくさんのクエリが実行されていて、hbm.xmlマッピングがlazy=falseステートメントでいっぱいになっていることに気づきました。NHibernate 3.0にアップグレードし、lazy = falseのものを削除しましたが、すべてがはるかに高速でした....しかし、次のエラーが発生します。

System.InvalidOperationException:XMLドキュメントの生成中にエラーが発生しました。---> System.InvalidOperationException:タイプUserProxyが予期されていませんでした。XmlIncludeまたはSoapInclude属性を使用して、静的に認識されていないタイプを指定します。

Userは、次のようにクラスタグからlazy=falseプロパティを削除したクラスです。

<class name="User" table="Users" >
  <id name="DatabaseID" unsaved-value="0" column="ID" type="integer" >
    <generator class="native"/>
   </id>
   <property name="IsExpert"/>
    .....more stuff here....
</class>

私のWebサービスには次のような方法があります(少し簡略化されています。実際には、サービスとnhibernateの間にリポジトリのようなパターンを使用しています)。

    [WebMethod]
    public User GetUser(int userid)
    {
        session = GetCurrentSession();
        return session.Load<User>(userid);                         
    }

Webサービスはユーザーをシリアル化することを期待しており、NHibernateはUserProxy(正確にはユーザーではありません)を提供します。これをどのように克服する必要がありますか?

4

2 に答える 2

2

Web メソッドからエンティティを返さないでください。DTO を使用します。

于 2011-07-30T13:11:09.360 に答える
0

Web サービスはプロキシをシリアル化できません - session.Load(userId) はプロキシを返します。session.Get(userId) を使用する必要があります。

DTO を使用する必要があるという回答は役に立たないと思います。DTO には時間と場所があり、エンティティを返したい場合もあります。

ユーザーに子プロキシ プロパティがある場合、この状況を処理するためのクラスがあります。基本的に、すべてのプロパティをループし (リフレクションを使用し、子オブジェクトとコレクションを再帰的に通過します)、NHibernate.IsInitialized を使用して、プロパティがプロキシか本物かを確認します。プロキシの場合は null に設定されるため、WCF でシリアル化できるようになります。

于 2011-07-31T18:56:07.260 に答える