EF4 ПОСТЕПЕННО проблемы Сериализации WCF (никакая ленивая загрузка, проксируйте/нет прокси, циклические ссылки, и т.д.),

Хорошо, я хочу удостовериться, что я покрываю свою ситуацию и все, что я попробовал полностью. Я вполне уверен, в чем я нуждаюсь/хочу, может быть сделан, но я не вполне нашел идеальную комбинацию для успеха.

Я использую Платформу Объекта 4 RTM и ПОСТЕПЕННО поддержка. Я обращаюсь к запросу для объекта (Конфигурация), которая содержит many-many отношения с другим объектом (Приложение). Я выключаю ленивую загрузку и отключаю создание прокси для контекста и явно загружаю свойство навигации (любой через.Include () или.LoadProperty ()). Однако, когда свойство навигации загружается (то есть, Приложения загружается для данной Конфигурации), объекты Приложения, которые были загружены уже, содержат ссылки на Конфигурации, которые были принесены к памяти. Это создает циклическую ссылку.

Теперь я знаю DataContractSerializer, что использование WCF может обработать циклические ссылки путем установки preserveObjectReferences параметра на истинный. Я попробовал это несколькими различными реализациями атрибута, которые я нашел онлайн. Необходимо предотвратить "граф объектов, содержит циклические ссылки и не может быть сериализирован" ошибка. Однако это не предотвращает сериализацию всего графика, назад и вперед между Конфигурацией и Приложением.

Если я вызываю его с помощью WcfTestClient.exe, я получаю stackoverflow (ха!) исключение от клиента и я полит из шланга. Я получаю различные результаты различных сред вызова (модульный тест C# с локальной ссылкой к веб-сервису, кажется, работает хорошо, хотя я все еще могу развернуть назад и вперед между Конфигурациями и Приложениями бесконечно, но вызов его от coldfusion среды только возвращает первую Конфигурацию в списке и ошибках на других.) Моя главная цель состоит в том, чтобы иметь сериализированное представление графика, который я явно загружаю из EF (т.е.: список Конфигураций, каждого с их Приложениями, но никаким Приложением назад, чтобы Сконфигурировать навигацию.)

Примечание: Я также попытался использовать метод ProxyDataContractResolver и сохранить создание прокси включенным из моего контекста. Это аварийно завершает жалобу на неизвестные типы, с которыми встречаются. Я считал, что ProxyDataContractResolver не полностью работал в Beta2, но должен работать в RTM.

Для некоторой ссылки вот примерно, как я запрашиваю данные в сервисе:

var repo = BootStrapper.AppCtx["AppMeta.ConfigRepository"] as IRepository<Config>;
repo.DisableLazyLoading();
repo.DisableProxyCreation();

//var temp2 = repo.Include(cfg => cfg.Apps).Where(cfg => cfg.Environment.Equals(environment)).ToArray();
var temp2 = repo.FindAll(cfg => cfg.Environment.Equals(environment)).ToArray();
foreach (var cfg in temp2)
{
    repo.LoadProperty(cfg, c => c.Apps);
}

return temp2;

Я думаю, что затруднение моей проблемы при загрузке свойств навигации для ПОСТЕПЕННО объектов от Платформы Объекта 4, это предварительно заполняет свойства навигации для объектов уже в памяти. Это в свою очередь поливает из шланга сериализацию WCF, несмотря на каждое усилие, приложенное для надлежащей обработки циклических ссылок.

Я знаю, что это - большая информация, но это действительно стоит на моем пути продвинуться с EF4/POCO в нашей системе. Я нашел несколько статей и блогов, затрагивающих на эти предметы, но ни за что в жизни, я не могу решить этот вопрос. Не стесняйтесь просто задавать вопросы и помогать мне провести коллективное обсуждение этой ситуации.

PS: Ради того, чтобы быть полным, я ввожу сервисы WCF с помощью ГЛАВНОЙ сборки Spring.NET для фиксации к Spring. ServiceModel. Активация. ServiceHostFactory. Однако я не думаю, что это - источник проблемы.

Править: Класс ProxyDataContractResolver работает правильно, если у меня нет циклических ссылок. (т.е.: Я делаю метод set Приложения. Конфигурации, чтобы быть частным, который предотвращает сериализацию свойства.) Это аварийно завершается, появляется, когда это поражает Конфигурации через объект Приложения - они, кажется, не распознаны как тот же тип как высокоуровневые Конфигурации.

EDIT2: кажется, что или EF или WCF не распознают, что объекты действительно равны. т.е.: 'Конфигурация' совпадает с особой 'Конфигурацией. Приложения [x].Configs [y]'. Ключи объекта правильно устанавливаются в CSDL для каждой модели, и я переопределил Равняние () функция для сравнения объектов на основе их свойства 'Id'. Это соответствует признакам, поскольку никакая ошибка циклической ссылки не брошена, все же это - действительно циклическая ссылка (и аварийно завершает WcfTestClient.exe), И аварийные завершения ProxyDataContractResolver, когда это поражает 'Конфигурацию. Приложения [x].Configs [y]' уровень Конфигураций. (Это не знает, как отобразить прокси Конфигурации. ProxyDataContractResolver работает иначе. Это похоже на это, знает, как обработать начальный раунд объектов, но второй уровень это рассматривает как различные объекты.)

Ничего себе, я могу быть многословным. Жаль люди!

8
задан kdawg 27 May 2010 в 15:08
поделиться

2 ответа

Попробуйте установить myContext.ContextOptions.ProxyCreationEnabled = false;

Если проблема решена (как моя), значит, вы не выполнили шаги, указанные в: http://msdn.microsoft.com/en -us / library / ee705457.aspx

Это решило проблему для меня.

0
ответ дан 6 December 2019 в 00:05
поделиться

Хммм, возможно, я не до конца понял проблему, но каждый раз, когда я сталкиваюсь с циклическими ссылками с WCF, ответ состоит в том, чтобы изменить [DataContract] в классах-нарушителях на [DataContract (IsReference = true) ].

Это огромная помощь по сравнению со всей этой кучей возни с преобразователями контрактов, которая была необходима до WCF 3.5 SP1.

Надеюсь, это поможет.

1
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: