Хорошо, я хочу убедиться, что я тщательно освещаю свою ситуацию и все, что я пробовал. Я почти уверен, что то, что мне нужно / хочу, может быть сделано, но я не нашел идеального сочетания для успеха.
Я использую Entity Framework 4 RTM и его поддержку POCO. Я хочу запросить объект (Config), который содержит отношение "многие ко многим" с другим объектом (App). Я отключаю отложенную загрузку и отключаю создание прокси для контекста и явно загружаю свойство навигации (либо с помощью .Include (), либо .LoadProperty ()). Однако, когда свойство навигации загружается (то есть приложения загружаются для данной конфигурации), загруженные объекты приложения уже содержат ссылки на конфигурации, которые были перенесены в память. Это создает круговую ссылку.
Теперь я знаю, что DataContractSerializer, который использует WCF, может обрабатывать циклические ссылки, установив для параметра preserveObjectReferences значение true. Я пробовал это с парой различных реализаций атрибутов, которые нашел в Интернете. Это необходимо для предотвращения ошибки «граф объекта содержит циклические ссылки и не может быть сериализован». Однако это не препятствует сериализации всего графа между Config и App.
Если я вызываю его через WcfTestClient.exe, я получаю исключение stackoverflow (ha!) От клиента, и меня охлаждают. Я получаю разные результаты из разных сред вызова (модульный тест C # с локальной ссылкой на веб-службу, похоже, работает нормально, хотя я все еще могу бесконечно переходить между конфигурациями и приложениями, но вызов его из среды холодного слияния возвращает только первую конфигурацию в списке и ошибки в остальных.) Моя основная цель - получить сериализованное представление графика, который я явно загружаю из 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;
Я думаю, что суть моей проблемы заключается в том, что при загрузке свойств навигации для объектов POCO из Entity Framework 4 он предварительно заполняет свойства навигации для объектов, уже находящихся в памяти. Это, в свою очередь, усложняет сериализацию WCF, несмотря на все усилия, приложенные для правильной обработки циклических ссылок.
Я знаю, что это много информации, но она действительно мешает мне продвигаться вперед с EF4 / POCO в нашей системе. Я нашел несколько статей и блогов, затрагивающих эти темы, но, хоть убей, я не могу решить эту проблему. Не стесняйтесь просто задавать вопросы и помогите мне провести мозговой штурм в этой ситуации.
PS: Я внедряю службы WCF с помощью сборки HEAD Spring.NET для исправления Spring.ServiceModel.Activation.ServiceHostFactory. Однако я не думаю, что это источник проблемы.
РЕДАКТИРОВАТЬ: Класс ProxyDataContractResolver работает правильно, если у меня нет циклических ссылок. (например: я делаю установщик App.Configs закрытым, что предотвращает сериализацию свойства.) Похоже, что он взрывается, когда попадает в Configs через объект App - они, похоже, не распознаются как того же типа, что и Конфиги верхнего уровня.
EDIT2: похоже, что EF или WCF не распознают, что сущности действительно равны. то есть: «Config» - это то же самое, что и конкретный «Config.Apps [x] .Configs [y]». Ключи сущностей правильно установлены в CSDL для каждой модели, и я переопределил функцию Equals () для сравнения сущностей на основе их свойства «Id». Это соответствует симптомам, поскольку ошибка циклической ссылки не возникает, но это действительно циклическая ссылка (и взрывает WcfTestClient.exe) И ProxyDataContractResolver взрывается, когда достигает уровня 'Config.Apps [x] .Configs [y]' Конфигов. (Он не знает, как сопоставить прокси-сервер Config. ProxyDataContractResolver работает иначе. Как будто он знает, как обрабатывать начальный раунд сущностей, но второй уровень он рассматривает как разные сущности.)
Вау, я могу быть многословным. Извините, ребята!