【问题标题】:How to get NHibernate entity list over the web service如何通过 Web 服务获取 NHibernate 实体列表
【发布时间】:2011-08-08 02:03:56
【问题描述】:

我的网络服务是:

[WebMethod]        
public List<Activity> ActivityInf()
{
       List<Activity> operationActivities = (List<Activity>)operationActivityCtrl.Result;
       return operationActivities;
}

事实上,当我更改 List 时,我看到了 operationActivities。但是当我运行它时,我遇到了一些错误。

“/”应用程序中的服务器错误。

无法序列化 System.Collections.Generic.IList`1[[Test.Core.Model.DS.PCus, Test.Core.Model, Version=1.0 类型的成员 Test.Core.Model.DS.Act.PCustomerList。 0.0, Culture=neutral, PublicKeyToken=null]] 因为它是一个接口。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NotSupportedException:无法序列化 System.Collections.Generic.IList`1[[Test.Core.Model.DS.PCus, Test.Core 类型的成员 Test.Core.Model.DS.Act.PCustomerList .Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 因为它是一个接口。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

【问题讨论】:

    标签: nhibernate service xml-serialization entity


    【解决方案1】:

    从异常看来,您的 Activity 对象包含不可序列化的属性(一个不可序列化的 IList)。通常,当您需要通过 WCFWeb 服务 传输 NHibernate 实体时,您实际上并不传输实体,而是使用 DTO

    DTO 是比只包含您需要传递的信息的实体更简单的对象,而不是可以包含复杂对象图的整个 NHibernate 实体。这些还将包含 Lists 而不是 IList 的具体实现。基本上它们是可序列化的。如果您搜索 DTO 和 NHibernate,将会有更多关于此主题的信息。

    【讨论】:

      【解决方案2】:

      您可能在 Activity 对象中具有仍然附加到 NHibernate 代理的属性。避免这种情况的快速方法是使用 Eager [Not.LazyLoad()] 加载。如果您使用的是 Fluent NHibernate,则如下所示:

      References<Activity>(x => x.ActivityType, "ActivityType_Id")
          .Nullable()
          .Column("ActivityType_Id")
          .Not.LazyLoad()
          .ForeignKey("Id");
      

      我通常喜欢在我的模型项目中为 Dtos 设置一个命名空间。像 MyCompany.MyModel.Entities(用于 NHibernate)和 MyCompany.MyModel.Dtos(用于我需要序列化的东西)。

      然后我使用AutoMapper 将给定的实体对象转换为相应的 Dto 并对其进行序列化,例如:

      var activityDto = Mapper.Map<Activity, Dtos.Activity>(activity);
      return JsonSerializer.SerializeToString<Dtos.Activity>(activityDto);
      

      【讨论】:

      • 但我不使用 Fluent NHibernate。您有正常 NHibernate 的解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多