Как заставить Entity Framework всегда получать обновленные данные из базы данных?



Я использую EntityFramework.Расширенный библиотека для выполнения пакетных обновлений. Единственная проблема заключается в том, что EF не отслеживает пакетные обновления, выполняемые библиотекой. Поэтому, когда я запрашиваю DbContext снова он не возвращает обновленные объекты.



я обнаружил, что с помощью AsNoTracking() метод во время запроса отключает отслеживание и получает свежие данные из базы данных. Однако, поскольку EF не отслеживает сущности, запрошенные с помощью AsNoTracking(), Я не в состоянии выполнить любой обновление запрошенных данных.



есть ли способ заставить EF получать последние данные при отслеживании изменений?

809   5  

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

    Ничего не найдено.