Як змусити Entity Framework завжди отримувати оновлені дані з бази даних?


87

Я використовую EntityFramework.Extended бібліотеку для виконання пакетних оновлень. Єдина проблема - EF не відстежує пакетні оновлення, виконувані бібліотекою. Отже, коли я DbContextзнову запитую, він не повертає оновлені сутності.

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

Чи є спосіб змусити EF отримувати останні дані під час відстеження змін?


2
29 тис. Переглядів і лише 19 голосів за це ... ну, я все одно додав свій
jleach

Відповіді:


148

Спробуйте, щоб оновити одну сутність:

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

Редагувати: Щоб отримати свіжі дані для колекції сутностей, варто спробувати розпорядитися DbContextекземпляром після кожного запиту.


Дякую! Чи є спосіб перезавантажити колекцію сутностей, а не одну? Бажано весь DbSet.
Саравана

Чи потрібно ще щось, щоб це можна було вважати відповіддю?
PlTaylor

1
Так, він все ще не показує, як перезавантажити колекцію сутностей.
Саравана

1
Ви пробували утилізувати свій dbcontext і створити новий?
PlTaylor 05.03.14

2
Мені знадобилися години, щоб дійти такого висновку. Це EDIT у відповіді - це те, що допомогло мені знайти своє рішення. Дякую!
BeemerGuy

17

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

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

Логіка цього полягала - моє оновлення додало сутність, щоб вона відстежувала зміни в ній. Це додає його до місцевого магазину. Після цього будь-які спроби отримати сутність з функціональними проксі-серверами призведуть до того, що вона захопить локальний, замість того, щоб вийти на базу даних і повернути нову сутність із підтримкою проксі. Я спробував опцію перезавантаження вище, яка дійсно оновлює об’єкт із бази даних, але це не дає вам проксі-об'єкт із ледачим завантаженням. Я спробував зробити a Find(id), Where(t => t.Id = id), First(t => t.Id = id). Нарешті, я перевірив наявні штати, які були надані, і переконався, що існує стан "відокремлений". Еврика! Сподіваюся, це комусь допомагає.


Де ви застосовуєте відокремлений стан, щоб ліниве завантаження працювало, будь ласка? Я спробував ваше рішення, і воно не спрацювало для мене, я повинен щось пропустити.
Рекс,

2
Я розібрався: 1. зберегти сутність, 2. встановити стан на відокремлений, 3. прочитати сутність з db. Дякую за підказку!
Рекс,

1

Виконання коду в тому ж контексті не дасть вам оновлених сутностей. Він буде додавати лише нові сутності, створені в базі даних між прогонами. Зусилля EF-перезавантаження можна зробити так:

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

1

Я оголосив змінну сутності без призначення як частину класу. Це дозволило мені розпорядитися екземпляром, не втрачаючи змінну для посилання іншими методами. Я щойно натрапив на це, тому він не має багато часу роботи під поясом, але поки, здається, він працює нормально.

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 ...
}

0

Для мене ... я отримую доступ до мого DbContext таким чином:

_viewModel.Repo.Context

Щоб змусити EF потрапити в базу даних, я роблю це:

_viewModel.Repo.Context = new NewDispatchContext();

Заміна поточного DbContext новим екземпляром. Тоді наступного разу, коли я користуватимусь послугами даних, вони отримуватимуть дані з бази даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.