Отключена ленивая загрузка EF не работает правильно? - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь вернуть несколько списков элементов через службу WCF и хочу контролировать каждый объект, загруженный в список, чтобы избежать исключений переполнения стека при сериализации и возврате результата.

Я заполняю эти списки с помощью LINQ to Entities, и я отключил Ленивую загрузку для модели EF ... но когда я пытаюсь это сделать, многие ссылки заполняются, и при попытке вернуть Список возникает исключение.

Это пример:

public class DelegacionesDAO : IDelegacionesDAO
    {
        Model.Entities entities = new Model.Entities();

        public DelegacionesDAO()
        {
            entities.ContextOptions.ProxyCreationEnabled = false;
            entities.ContextOptions.LazyLoadingEnabled = false;
        }

    public List<Model.Things> GetDelegaciones()
            {
                IQueryable<Model.Things> thingsList= from things in entities.Things
                                                     select things;

                return thingsList.ToList<Model.Things>();
            }
}

На эту таблицу «Вещи» ссылаются другие, такие как «Персоны» (у которых есть вещи), и в этом проблема, когда я пытаюсь ее вернуть, каждое «Вещи» имеет список «Персон» и далее.

Я что-то упустил ??

Заранее спасибо!

Edit: Добавил еще немного кода. Теперь он работает ... Я думаю, что он загружает все свойства навигации, когда вы пытаетесь "посмотреть" его, даже если он не загружен: -S

Теперь у меня есть только сомнение, если я делаю это хорошо, создавая экземпляр лица в конструкторе, чтобы использовать его через WCF.

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Не работайте с долгоживущими контекстами (полевыми сущностями в вашем случае) при работе с WCF:

  • Это не безопасно для потоков (особенно вызывая SaveChanges из других потоков, в то время как другие потокиподготовка данных)
  • Контекст собирает и связывает каждую загружаемую сущность (если вы явно не используете MergeOption.NoTracking)
1 голос
/ 13 сентября 2011

Если у вас отключена отложенная загрузка, вы должны указать EF загрузить ссылки.

Попробуйте это:

var thingsList= (from things in entities.Things
                select things) as ObjectQuery<Model.Things>;
thingsList = thingsList.Include("Persons"); //name of navigation property

return thingsList.ToList<Model.Things>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...