Ответ 1
Попробуйте это, чтобы обновить один объект:
Context.Entry<T>(entity).Reload()
Edit:
Чтобы получить свежие данные для коллекции объектов, стоит попробовать уничтожить экземпляр DbContext
после каждого запроса.
Я использую библиотеку EntityFramework.Extended для выполнения пакетных обновлений. Единственная проблема - EF не отслеживает пакетные обновления, выполняемые библиотекой. Поэтому, когда я снова запрашиваю DbContext
, он не возвращает обновленные сущности.
Я обнаружил, что при использовании метода AsNoTracking()
при запросе отключается отслеживание и получает свежие данные из базы данных. Однако, поскольку EF не отслеживает объекты, запрошенные с помощью AsNoTracking()
, я не могу выполнить какое-либо обновление по запрошенным данным.
Есть ли способ заставить EF получать последние данные при отслеживании изменений?
Попробуйте это, чтобы обновить один объект:
Context.Entry<T>(entity).Reload()
Edit:
Чтобы получить свежие данные для коллекции объектов, стоит попробовать уничтожить экземпляр DbContext
после каждого запроса.
Я наткнулся на этот вопрос, ища решение проблемы, с которой я сталкивался, когда свойства обновления не заполнялись после обновления объекта. Всякий раз, когда я пытался перезагрузить объект из базы данных, он бы захватил запись из локального хранилища, а не заполнял навигационные свойства с помощью ленивой загрузки. Вместо того, чтобы разрушать контекст и воссоздавать один, я нашел, что это позволило мне получить свежие данные с работающими прокси:
_db.Entry(entity).State = EntityState.Detached;
Логикой этого было - мое обновление привязало объект, чтобы отслеживать изменения. Это добавляет его в локальный магазин. После этого любые попытки получить объект с функциональными прокси-серверами приведут к тому, что он захватит локальный, вместо того, чтобы идти в db и возвращать новый объект с поддержкой прокси. Я попробовал вариант перезагрузки выше, который обновляет объект из базы данных, но это не дает вам прокси-объект с ленивой загрузкой. Я попытался сделать Find(id), Where(t => t.Id = id), First(t => t.Id = id)
. Наконец, я проверил доступные состояния, которые были предоставлены, и увидел, что существует состояние "Отдельно". Эврика! Надеюсь, это поможет кому-то.
Выполнение кода в том же контексте не даст вам обновленных объектов. Он будет добавлять только новые объекты, созданные в базе данных между циклами. Перезагрузка EF может быть выполнена следующим образом:
ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();
Я объявил переменную сущности без назначения как часть класса. Это позволило мне избавиться от экземпляра без потери переменной для ссылки другими методами. Я просто натолкнулся на это, поэтому он не имеет много времени исполнения под ним, но пока все работает нормально.
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 ...
}