Как заставить Entity Framework всегда получать обновленные данные из базы данных?
Я использую EntityFramework.Расширенный библиотека для выполнения пакетных обновлений. Единственная проблема заключается в том, что EF не отслеживает пакетные обновления, выполняемые библиотекой. Поэтому, когда я запрашиваю DbContext снова он не возвращает обновленные объекты.
я обнаружил, что с помощью AsNoTracking() метод во время запроса отключает отслеживание и получает свежие данные из базы данных. Однако, поскольку EF не отслеживает сущности, запрошенные с помощью AsNoTracking(), Я не в состоянии выполнить любой обновление запрошенных данных.
есть ли способ заставить EF получать последние данные при отслеживании изменений?
5 ответов:
пожалуйста, попробуйте это, чтобы обновить один объект:
Context.Entry<T>(entity).Reload()Edit: Чтобы получить свежие данные для коллекции сущностей стоит попробовать утилизировать
DbContextэкземпляр после каждого запроса.
я наткнулся на этот вопрос при поиске решения проблемы, с которой я столкнулся, когда свойства навигации не заполнялись после обновления сущности. Всякий раз, когда я пытался перезагрузить объект из базы данных, он будет захватывать запись из локального хранилища вместо этого, который не будет заполнять свойства навигации через ленивую загрузку. Вместо того, чтобы уничтожить контекст и воссоздать его, я обнаружил, что это позволило мне получить свежие данные с прокси рабочий:
_db.Entry(entity).State = EntityState.Detached;логика этого была - мое обновление прикрепило сущность, чтобы она отслеживала изменения в ней. Это добавляет его в локальный магазин. После этого любые попытки получить объект с функциональными прокси приведут к тому, что он захватит локальный, а не выйдет в БД и вернет новый объект с поддержкой прокси. Я попробовал опцию reload выше, которая обновляет объект из базы данных, но это не дает вам проксированный объект с ленивой загрузкой. Я пробовал делать
Find(id), Where(t => t.Id = id), First(t => t.Id = id). Наконец, я проверил доступные состояния, которые были предоставлены, и увидел, что есть "отстраненное" состояние. Эврика! Надеюсь, это кому-то поможет.
выполнение кода в том же контексте не приведет к обновлению сущностей. Он будет добавлять только новые объекты, созданные в базе данных между запусками. EF force reload можно сделать так:
ObjectQuery _query = Entity.MyEntity; _query.MergeOption = MergeOption.OverwriteChanges; var myEntity = _query.Where(x => x.Id > 0).ToList();
Я объявил переменную сущности, без присвоения, как часть класса. Это позволило мне избавиться от экземпляра без потери переменной для ссылки другими методами. Я просто наткнулся на это, поэтому у него нет много времени выполнения под его поясом, но до сих пор он, кажется, работает нормально.
public partial class frmMyForm { private My_Entities entity; public frmMyForm() { InitializeComponent(); } private void SomeControl_Click(object sender, EventArgs e) { db.SaveChanges(); db.Dispose(); entity = new My_Entities(); //more code using entity ... }
для меня ... Я получаю доступ к своему DbContext следующим образом:
_viewModel.Repo.Contextчтобы заставить EF попасть в базу данных, я делаю это:
_viewModel.Repo.Context = new NewDispatchContext();перезапись текущего DbContext с новым экземпляром. Затем в следующий раз, когда я использую свои службы данных, они получают данные из базы данных.
Comments