none
EF7 связанные таблицы... и ApplicationUser (LazyLoading) RRS feed

  • Вопрос

  • Добрый день всем..

    Такой простой вопросик.. есть проект с vNext и EF7, 

    в класс ApplicationUser добавлена ссылка на другую таблицу.

            public int ParamId { get; set; }
            [ForeignKey("ParamId")]
            public Param Param { get; set; }

    Почему он всегда загружает эти данные из другой таблицы? 

    29 января 2016 г. 14:00

Ответы

  • Всем спасибо за ответы!

    Да, если свойство виртуальное, то оно грузится сразу... если нет - не грузиться - в EF7 все работает.

    Я смотрю в отладчике, после получения объекта из таблицы.

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

    Есть модель, которая содержит ссылку (не виртуальную, но [InverseProperty]) на ApplicationUser.
    Есть ApplicationUser, который содержит ссылку на выше написанную модель (не виртуальная, через [ForeignKey])

    Если я в контроллере вызову _context.Users.SingleOrDefault(u => u.Id == "GUID"), то получу ApplicationUser без объекта связанной таблицы...

    Если я в контроллере вызову _context.MyModels.SingleOrDefault(m => m.MyModelId == 1), то получу объект без ApplicationUser

    Если я в контроллере вызову оба метода (сначала пользователя, потом MyModel), то будут доступны объекты связанных таблиц в обоих моделях.

    Причем пока второй вызов (получение MyModel) не вызван - ApplicationUser не содержит данных. Как только выполняется второй вызов - у меня обе модели содержат оба связанных объекта.

    Переделал модели согласно документации EF7, через InverseProperty (раньше было везде ForeignKey), вроде пропала проблема, когда всегда, при любом варианте загружался объект из ApplicationUser. Не уверен что связано с этим, возможно что-то еще менял.. Осталось только когда выполняются оба метода (это я для проверки делал)

    Наверно тему можно закрыть :)

    • Помечено в качестве ответа Alexey.U 3 февраля 2016 г. 22:12
    3 февраля 2016 г. 22:12

Все ответы

  • А как вы видите, что они загружены? Обычно они загружаются, только по требованию. Т.е. должна быть ссылка на это свойство.

    Сделаем содержимое сообщества лучше, вместе!

    30 января 2016 г. 13:12
    Модератор
  • Да вот просто, либо просто получаю объект Param или ApplicationUser из базы простым SingleOrDefault (или SingleOrDefaultAsync) и эти объекты уже загружены... не надо делать Include в запросе. С другими же DbSet таких проблем нет (те, которые не связаны с ApplicationUser)... 



    • Изменено Alexey.U 1 февраля 2016 г. 5:02
    1 февраля 2016 г. 5:01
  • Почему я спросил, дело в том, что увидеть реально, загружен или нет объект (при Lazy Loading) можно двумя способами: во время отладки отключит автоматическое вычисление свойств (тогда можно точно увидеть null там или нет), или используя профайлер SQL Server, т.е. если ссылка на объект свойства вызывается где-нибудь позже после использования объекта владельца, то в профайлере можно увидеть запрос к БД. Скорее всего у вас используется для конкретной сущности именно Lazy Loading вместо упомянутого вами Eagerly Loading. Попробуйте отключить отложенную загрузку, Configuration.LazyLoadingEnabled = false или наоборот. Судя по тому, что там у вас свойство не виртуальное, отложенная загрузка не должна работать вообще. В любом случае, попробуйте поиграться с настройками и не забывайте, что EF не имеет статуса RTM пока ещё.

    Сделаем содержимое сообщества лучше, вместе!

    3 февраля 2016 г. 20:02
    Модератор
  • Насколько я знаю, EF7 еще не поддерживает ленивой загрузки. Надеюсь вы используете не для продакшена?

    Mak Arti

    3 февраля 2016 г. 21:07
  • Всем спасибо за ответы!

    Да, если свойство виртуальное, то оно грузится сразу... если нет - не грузиться - в EF7 все работает.

    Я смотрю в отладчике, после получения объекта из таблицы.

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

    Есть модель, которая содержит ссылку (не виртуальную, но [InverseProperty]) на ApplicationUser.
    Есть ApplicationUser, который содержит ссылку на выше написанную модель (не виртуальная, через [ForeignKey])

    Если я в контроллере вызову _context.Users.SingleOrDefault(u => u.Id == "GUID"), то получу ApplicationUser без объекта связанной таблицы...

    Если я в контроллере вызову _context.MyModels.SingleOrDefault(m => m.MyModelId == 1), то получу объект без ApplicationUser

    Если я в контроллере вызову оба метода (сначала пользователя, потом MyModel), то будут доступны объекты связанных таблиц в обоих моделях.

    Причем пока второй вызов (получение MyModel) не вызван - ApplicationUser не содержит данных. Как только выполняется второй вызов - у меня обе модели содержат оба связанных объекта.

    Переделал модели согласно документации EF7, через InverseProperty (раньше было везде ForeignKey), вроде пропала проблема, когда всегда, при любом варианте загружался объект из ApplicationUser. Не уверен что связано с этим, возможно что-то еще менял.. Осталось только когда выполняются оба метода (это я для проверки делал)

    Наверно тему можно закрыть :)

    • Помечено в качестве ответа Alexey.U 3 февраля 2016 г. 22:12
    3 февраля 2016 г. 22:12