Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Попробуйте это, чтобы обновить один объект:

Context.Entry<T>(entity).Reload()

Edit: Чтобы получить свежие данные для коллекции объектов, стоит попробовать уничтожить экземпляр DbContext после каждого запроса.

Ответ 2

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

_db.Entry(entity).State = EntityState.Detached;

Логикой этого было - мое обновление привязало объект, чтобы отслеживать изменения. Это добавляет его в локальный магазин. После этого любые попытки получить объект с функциональными прокси-серверами приведут к тому, что он захватит локальный, вместо того, чтобы идти в db и возвращать новый объект с поддержкой прокси. Я попробовал вариант перезагрузки выше, который обновляет объект из базы данных, но это не дает вам прокси-объект с ленивой загрузкой. Я попытался сделать Find(id), Where(t => t.Id = id), First(t => t.Id = id). Наконец, я проверил доступные состояния, которые были предоставлены, и увидел, что существует состояние "Отдельно". Эврика! Надеюсь, это поможет кому-то.

Ответ 3

Выполнение кода в том же контексте не даст вам обновленных объектов. Он будет добавлять только новые объекты, созданные в базе данных между циклами. Перезагрузка EF может быть выполнена следующим образом:

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();

Ответ 4

Я объявил переменную сущности без назначения как часть класса. Это позволило мне избавиться от экземпляра без потери переменной для ссылки другими методами. Я просто натолкнулся на это, поэтому он не имеет много времени исполнения под ним, но пока все работает нормально.

public partial class frmMyForm
{
    private My_Entities db;

    public frmMyForm()
    {
        InitializeComponent();
    }

    private void SomeControl_Click(object sender, EventArgs e)
    {
        db.SaveChanges();
    db.Dispose();
        db = new My_Entities();
    ...  More Code using db ...
}