Context.Entry.Reference.Load загружает все ссылки внутри возвращенного объекта - PullRequest
0 голосов
/ 17 октября 2018

Сценарий:

public class A{
    public B InstanceOfB { get; set; }
}

public class B{
    public string Name { get; set; }
    public virtual ICollection<A> ListOfA { get; set; }
}

public void Boo(){
   using (var db = new myContext()){
       var instanceOfA = db.A.Find(1);
       db.Entry(instanceOfA).Reference(a => a.InstanceOfB).Load();
   }
}

В моем dbcontext я выключил ProxyCreationEnabled и включил LazyLoadingEnabled.

Когда я использую Load, ссылка свойства ListOfA также загружается, и эторекурсивный.

Как я могу предотвратить это поведение?

1 Ответ

0 голосов
/ 17 октября 2018

В вашем сценарии ленивая загрузка включена.Любая попытка проверить ListOfA приведет к тому, что EF попытается лениво загрузить эту коллекцию.Если db все еще находится в области видимости, он будет загружен (если нет, вы получите исключение).

В комментариях вы указали, что проверяете значение в отладчике, поэтомузапуск загрузки.

Вы можете легко наблюдать за командами SQL по мере их поступления, наблюдая за начальной загрузкой и последующей отложенной загрузкой при проверке коллекции.См.

Как мне записать сгенерированный SQL из DbContext.SaveChanges () в мою Программу?

Если вы хотите, чтобы дочерняя коллекция всегда загружалась, дажепосле того как объект покидает область действия db, вы можете сделать что-то вроде:

using System.Data.Entity; // Needed for the delegate form of .Include(...)

using (var db = new myContext())
{
    var instanceOfA = db.A
        .Include(a => a.InstanceOfB)
        .Include(a => a.InstanceOfB.ListOfA)
        .First(); // Or .Where(...) depending on needs
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...