Проблема перезагрузки Entity Framework Core 5

У меня возникают проблемы с получением свойств навигации после вставки.

Я сохраняю данные с помощью этого кода, не устанавливая свойства навигации, которые я не хочу менять. Например :

var entity = new MyEntity 
              {
                FirstId = 1, 
                FirstObject = null
                SecondId = 1, 
                SecondObject = null
                //...data to update
              };
_context.Update(myEntity);
_context.SaveChanges();

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

_context.Entry(entity).State = EntityState.Detached;
entity = _context.Set<MyEntity>().Where(e => e.Id == entity.Id).First();

Я тоже пробовал использовать перезагрузку:

_context.Entry(entity).State = EntityState.Detached;
_context.Entry(entity).Reload();

Тем не менее, свойства навигации равны нулю.

Я использую UseLazyLoadingProxies в конфигурации контекста. Единственный способ получить свойство навигации — загрузить его вручную:

_context.Entry(entity).Reference(e=> e.FirstObject ).Load()

Есть ли способ перезагрузить данные из БД (отбрасывая все кешированные данные) после SaveChanges()?


person Enrica Berardi    schedule 15.07.2021    source источник
comment
Вы можете отключить кеширование на уровне объекта для объекта. Проверьте этот stackoverflow .com/questions/15828811/   -  person SRK45    schedule 15.07.2021
comment
@marc_s Извините, я использую EF Core, я обновил проблему.   -  person Enrica Berardi    schedule 15.07.2021
comment
Почему вы используете Detached entity в этом случае? Я почти уверен, что это проблема.   -  person Svyatoslav Danyliv    schedule 15.07.2021
comment
@SvyatoslavDanyliv Я использую отключение, чтобы попытаться перезагрузить данные из базы данных. Без отсоединения у меня такое же поведение.   -  person Enrica Berardi    schedule 15.07.2021
comment
_context.Update(myEntity); это проблема   -  person Svyatoslav Danyliv    schedule 15.07.2021
comment
предоставьте минимальный воспроизводимый пример, включая ваши классы сущностей   -  person Daniel A. White    schedule 15.07.2021


Ответы (1)


Reload не извлекает связанные данные (свойства навигации). И ленивая загрузка не работает, так как вы создаете экземпляр объекта с помощью оператора new, поэтому он не проксируется, что важно для прокси-серверов ленивой загрузки.

Отсоединение и извлечение объекта для базы данных должно работать (и в моем тесте это работает, не уверен, почему вы утверждаете, что это не так):

_context.Entry(entity).State = EntityState.Detached;
entity = _context.Set<MyEntity>().Where(e => e.Id == entity.Id).First();

Но лучший вариант — создать проксируемый экземпляр вместо new, используя один из методов расширения (либо DbContext, либо DbSet<T>). Единственным недостатком является то, что вы теряете синтаксис инициализатора объекта, но все остальное будет работать. например

var entity = _context.CreateProxy<MyEntity>(); // <--

entity.FirstId = 1; 
entity.SecondId = 1; 
//...data to update
_context.Update(entity);

_context.SaveChanges();

// verify it is working
var firstObject = entity.FirstObject;
var secondObject = entity.SecondObject;
Debug.Assert(firstObject != null && secondObject != null);

person Ivan Stoev    schedule 15.07.2021
comment
Я работал как шарм, спасибо! Я не знаю, почему перезагрузка данных из базы данных не работает в моем случае... похоже, что ef хранит какой-то кеш модели. - person Enrica Berardi; 16.07.2021