Отправка сущностей Entity Framework через WCF: как предотвратить сериализацию полей навигации? - PullRequest
3 голосов
/ 29 февраля 2012

У меня проблема при отправке сгенерированных Entity Framework объектов со свойствами навигации по WCF.У меня есть Securities база данных для хранения финансовых данных и две таблицы внутри нее:

Stock : Id, Symbol, CompanyName, ExchangeNameOption: Id, StockId, OptionType, Strike

Я создал модель Entity Framework для этой базы данных.Затем я создал службу WCF, которая предоставляет клиентам сгенерированные Stock и Option EF-сущности.

Моя сгенерированная сущность Stock имеет свойство навигации EntityCollection<Option> Options.При попытке вернуть клиенту сущность Stock из службы WCF, я получаю SerializationException: WCF не может сериализовать свойство навигации Options, поскольку соединение с базой данных уже закрыто.

Я могу вызвать Options.Load()метод, когда соединение с базой данных открыто, чтобы заполнить свойство Options, но что мне делать, если я не хочу загружать полный граф объектов для Stock сущности?

Ответы [ 2 ]

13 голосов
/ 29 февраля 2012

Я боролся с этим некоторое время.

Сначала я отключил ленивую загрузку.Но у меня все еще были проблемы с циклами в моем графе объектов.
Затем я поместил теги [DataContract(IsReference = true)] на все мои объекты.Это сработало, но у меня все еще было много проблем с производительностью в отношении денормализованной базы данных.Наконец, я сломался и сделал dtos и использую AutoMapper, чтобы заполнить их.

Один из моих коллег сказал мне сделать это с самого начала, и я должен был просто послушать его.Сделайте себе одолжение и не совершайте ту же ошибку, что и я.

Редактировать
Я забыл упомянуть, что у меня были проблемы с десериализацией сущностей со свойствами типа ICollection<T>,Они будут десериализованы как массивы.Каким-то образом T[] реализует ICollection<T>, но Add и Remove будут генерировать исключения.Это была еще одна причина использовать DTO.

0 голосов
/ 26 июня 2013

С EF5, не уверен с EF4, это может работать. Измените настройку свойства навигации на частную.

public class OptionEntity
{
    // properties

    // navigation 
    public virtual StockEntity Stock { get; private set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...