将 Nhibernate 惰性代理与 Web 服务结合使用

发布于 2024-11-27 05:57:42 字数 1013 浏览 3 评论 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>

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

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

Web 服务期望序列化用户,NHibernate 为我提供了一个 UserProxy(这并不完全是一个用户)。我应该如何克服这个问题?

Recently i had some performance problems in a SOAP webservice I wrote a while ago. I noticed I had a lot of queries going on and my hbm.xml mappings where full of lazy=false statements. I upgraded to NHibernate 3.0 and removed the lazy = false stuff and everything was a LOT faster....but now i am getting the following error:

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type UserProxy was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

User is a class of which i removed the lazy=false property from the class tag like this:

<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>

My webservice has a method like this (simplified a little..in real-life i use a repository-like pattern between the service and nhibernate):

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

The webservice expects to serialize a user and NHibernate gives me a UserProxy (which is not a user exactly). How should I overcome this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

醉态萌生 2024-12-04 05:57:42

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

Don't return entities from the web method. Use a DTO.

2024-12-04 05:57:42

Web 服务无法序列化代理 - session.Load(userId) 将返回代理。您应该使用 session.Get(userId) 。

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

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

Webservices cannot serialise proxies - session.Load(userId) will return a proxy. You should user session.Get(userId) .

I think the answers saying you should use DTOs are not helpful, there is a time and place for DTOs and sometimes you may just want to return the entity.

If the User has child proxy properties, I have a class for handling this situation. Basically it loops through all properties (using reflection, and recursively going through child objects and collections) and uses the NHibernate.IsInitialized to check whether the property is a proxy or the genuine article. If it is a proxy then it sets it to null, thus making it possible for WCF to serialise it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文