Я довольно долго ломал голову над этим и очень благодарен за помощь.
Я пишу веб-сайт с использованием ASP.NET.Бизнес-уровень разделен на две части: BL-сервер и BL-клиент.BL-сервер в действительности является WCF-службой, которая предназначена для защиты уровня доступа к данным и БД.Служба WCF подключена к DAL, который, в свою очередь, читает из БД.Мы используем MSSQL.
Проблемы начались после внесения небольшого изменения в одну из таблиц БД (добавление столбца bool в таблицу «Ответы»).
Внезапно, каждый раз, когда я запрашиваючерез службу WCF, я получаю следующее исключение: «Исключение System.ServiceModel.CommunicationException не было обработано кодом пользователя Сообщение = Основное соединение было закрыто: соединение было неожиданно закрыто.»
Это довольно страннопотому что ошибка возникает, даже когда я запрашиваю данные из другой таблицы (например, «Отделы»).
Я провел некоторое копание и после установки трассировки для WCF-службы (см .: http://forums.asp.net/t/1476129.aspx/1), я обнаружил, что проблема в WCF-Service, которая вызвала внезапное закрытие соединения, была переполнением буфера. При попытке загрузить объекты в буфер возврата служба выдает следующее исключение: «Запись объекта с помощьюрекурсивная структура имеет ограничения, когда она имеет большую глубину. Рассмотрите возможность уменьшения глубины объекта. "
Это привело меня к тому, что я поставил точку останова в методе DAL, который загружает данные "Отделы" и проверяет объект, который должен был быть отправлен через службу WCF.
Получает объектесть несколько петель в нем.Вы можете просматривать его элементы в бесконечном цикле, так как у "Departments" есть несколько дочерних элементов, которые указывают на него.
Мне это показалось странным, поэтому я проверил файл .dbml, walla - "Departments""имеет список объектов, которые указывают на него.Я выяснил, что это можно включить / отключить в свойствах ссылки (между двумя объектами в файле .dbml).Свойство называется «Дочернее свойство» и, если оно включено, объявляет список объектов, имеющих внешний ключ для этого элемента.(Пример: если A имеет FK для B. Элемент B будет иметь следующий член: private EntitySet<A> _A;
)
В этот момент можно подумать, что решением будет установить все «дочерние свойства» длявсе ссылки между сущностями ложны.Но это заканчивается другими исключениями, такими как: «System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException не был обработан кодом пользователя. Message = Операция недопустима из-за текущего состояния объекта».(брошенный сущностью).
Более того, я не хочу связываться с файлом .dbml.Я знаю, что все было хорошо до того, как МЕНЬШЕ перешло в таблицу «Откликов», и мне трудно поверить, что незначительное изменение в одной таблице может привести к большому беспорядку в коде сущностей.
Извините за длинный пост, но эта проблема сводит меня с ума, и я хотел убедиться, что предоставил всю необходимую информацию.
Примечание: структура приложения является обязательным условием, и я не могу изменитьэто, так что давайте не будем вдаваться в подробности, пожалуйста.
Заранее спасибо, SummerBulb
Обновление: поскольку я использую контроль версий, я смог сравнить старый "BusinessElements.designer.cs "и новый.Я обнаружил, что старый файл содержит много кода, который имеет дело с сериализацией.Например: [global::System.Runtime.Serialization.DataMemberAttribute(Order=1)]
, атрибут, добавленный ко всем свойствам (получателям и установщикам).
Был ли этот код удален из-за нового логического значения?Как я могу вернуть код поддержки сериализации?