WCF та Entity Framework з Telerik GridModel

Це перекладено на Технічні форуми Telerik .

У мене є контекст Entity Framework (Code First, 4.1), який використовується у службовому шарі WCF. Якщо у мене служба налаштована таким чином:

public IEnumerable GetPlanMembers() {
    var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10)
                      select new Dto.PlanMember {
                          Id = member.Id,
                          FirstName = member.FirstName,
                          LastName = member.LastName
                      };

    return planMembers;
}

Служба працює нормально. Якщо я налаштував це так, перейдіть за посиланням Приклади для зв'язування сітки через веб-служби ...

public GridModel GetPlanMembers(GridState state) {
    var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10)
                      select new Dto.PlanMember {
                          Id = member.Id,
                          FirstName = member.FirstName,
                          LastName = member.LastName
                      };

    return planMembers.ToGridModel(state);
}

Це послідовно отримує виняток:

Основне з'єднання було закрито: з'єднання було закрито   несподівано.

Я впевнений, що це питання серіалізації. З будь-якої причини метод розширення ToGridModel не працює належним чином з EFCF 4.1. Що можна зробити, щоб це виправити?

Це також не працює, тому він повинен бути пов'язаний із серіалізацією типу GridModel , а не самим методом розширення, що є проблемою:

public GridModel GetPlanMembers(GridState state) {
    var planMembers = from member in this.DataSource.PlanMemberDbSet.Take(10)
                      select new Dto.PlanMember {
                          Id = member.Id,
                          FirstName = member.FirstName,
                          LastName = member.LastName
                      };

    var gridModel = new GridModel {
        Data = planMembers,
        Total = planMembers.Count()
    };

    return gridModel;
}
0

1 Відповіді

Справа в тому, що запити LINQ затримують виконання. Таким чином, ви повертаєте IQueryable. Дані насправді не завантажуються, поки WCF не спробує його серіалізувати. Проблема в тому, що ваше з'єднання вже закрито в той момент. Киньте . ToList() там, і ви повинні бути добрими.

2
додано
Це було частково правильно. Однак, це мене привело у правильному напрямку. Зрештою, я не можу використовувати об'єкти EFCF безпосередньо, оскільки я лінько завантажую. Реальний тип об'єкта - це динамічний проксі-сервер, який WCF не може серіалізувати. Мені потрібно було використовувати об'єкти передачі даних.
додано Автор Yuck, джерело
Якщо ви вмикаєте створення проксі-сервера та ліниве завантаження, ви можете піти без використання протоколу DTO. Ви також хочете переконатися, що ви додаєте атрибути [DataContract] до своїх об'єктів та вказуєте IsReference = true . В іншому випадку ви можете поставити проблему з циклами у графі об'єкта. Це може бути проблемою з DTO, якщо ви включатимете асоціації.
додано Автор cadrell0, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug