0

最近,我在不久前编写的 SOAP Web 服务中遇到了一些性能问题。我注意到我有很多查询正在进行,我的 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>

我的网络服务有这样的方法(简化了一点......在现实生活中,我在服务和休眠之间使用类似存储库的模式):

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

webservice 期望序列化一个用户,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 回答