将Nhibernate惰性代理与Web服务一起使用

将Nhibernate惰性代理与Web服务一起使用,nhibernate,soap,xml-serialization,lazy-evaluation,proxy-classes,Nhibernate,Soap,Xml Serialization,Lazy Evaluation,Proxy Classes,最近,我在不久前编写的SOAP Web服务中遇到了一些性能问题。我注意到有很多查询正在进行,我的hbm.xml映射中充满了lazy=false语句。我升级到NHibernate 3.0,删除了lazy=false的内容,一切都快了很多……但现在我得到了以下错误: System.InvalidOperationException:生成XML文档时出错。-->System.InvalidOperationException:不应为UserProxy类型。使用XmlInclude或SoapInclud

最近,我在不久前编写的SOAP Web服务中遇到了一些性能问题。我注意到有很多查询正在进行,我的hbm.xml映射中充满了lazy=false语句。我升级到NHibernate 3.0,删除了lazy=false的内容,一切都快了很多……但现在我得到了以下错误:

System.InvalidOperationException:生成XML文档时出错。-->System.InvalidOperationException:不应为UserProxy类型。使用XmlInclude或SoapInclude属性指定静态未知的类型

User是一个类,我从class标记中删除了该类的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]
公共用户GetUser(int userid)
{
session=GetCurrentSession();
返回session.Load(userid);
}

webservice希望序列化一个用户,而NHibernate给了我一个UserProxy(确切地说,它不是用户)。我应该如何克服这个问题

不要从web方法返回实体。使用DTO。

Web服务无法序列化代理-会话。加载(用户ID)将返回代理。您应该使用user session.Get(userId)

我认为说您应该使用DTO的答案是没有帮助的,DTO有时间和地点,有时您可能只想返回实体


如果用户有子代理属性,我有一个类来处理这种情况。基本上,它循环遍历所有属性(使用反射,递归遍历子对象和集合),并使用NHibernate.IsInitialized检查属性是代理还是真正的项目。如果它是一个代理,那么它会将其设置为null,从而使WCF可以序列化它。

似乎这个问题是相关的。这里建议对NHibernate和webservice(DTO)使用不同的类…我不喜欢管道。也许我会有更多的问题。现在,我刚刚关闭了lazy,并做了一些其他调整。@Gluip:您刚刚推迟了问题(并创建了一组不同的问题)。它会越来越大。在过去的4年里,这不是一个问题……如果我有时间真正解决它,我想我会研究单独的DTO。似乎我必须代表每个班级3次:(另一个指向DTO方向的答案…@Gluip:如果您的DTO与您的实体完全相同,那么您的服务只是一个SQL代理。也许您应该查看服务交互的设计方式。如果以前在会话中为同一实体创建了代理,session.Get还将返回代理。
    [WebMethod]
    public User GetUser(int userid)
    {
        session = GetCurrentSession();
        return session.Load<User>(userid);                         
    }