Как получить список сущностей NHibernate через веб-сервис - PullRequest
0 голосов
/ 04 августа 2011

Мой веб-сервис:

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

На самом деле, когда я изменил Список, я увидел операцию «Деятельности». но когда я его запустил, я получил ошибку.

Ошибка сервера в «/» приложении.

Невозможно сериализовать член Test.Core.Model.DS.Act.PCustomerList типа System.Collections.Generic.IList`1 [[Test.Core.Model.DS.PCus, Test.Core.Model, Version = 1.0. 0.0, Culture = нейтральный, PublicKeyToken = null]], потому что это интерфейс.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.NotSupportedException: невозможно сериализовать член Test.Core.Model.DS.Act.PCustomerList типа System.Collections.Generic.IList`1 [[Test.Core.Model.DS.PCus, Test.Core .Model, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль]], потому что это интерфейс.

Ошибка источника:

При выполнении текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местонахождении исключения может быть идентифицирована с помощью приведенной ниже трассировки стека исключений.

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Из исключения похоже, что ваш объект Activity содержит свойства, которые не сериализуются (IList, который не сериализуем). Обычно, когда вам нужно передать сущности NHibernate через WCF или веб-службы , вы фактически не переносите сущность, а вместо этого используете DTO .

DTO - это даже более простые объекты, чем ваши сущности, содержащие только ту информацию, которую вам нужно передать, а не всю сущность NHibernate, которая может содержать сложный граф объектов. Они также будут содержать конкретные реализации списков вместо IList. В основном они сериализуемы. По этой теме можно найти гораздо больше информации, если вы ищете DTO и NHibernate.

0 голосов
/ 07 августа 2011

Вероятно, у вас есть свойства в объекте 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 , чтобы преобразовать данный объект Entity в соответствующий Dto и сериализовать его, например:

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