Bagaimana cara memaksa Entity Framework untuk selalu mendapatkan data terbaru dari database?

91

Saya menggunakan perpustakaan EntityFramework.Extended untuk melakukan pembaruan batch. Satu-satunya masalah adalah EF tidak melacak pembaruan batch yang dilakukan oleh perpustakaan. Jadi ketika saya menanyakan DbContextlagi itu tidak mengembalikan entitas yang diperbarui.

Saya menemukan bahwa menggunakan AsNoTracking()metode saat membuat kueri menonaktifkan pelacakan dan mendapatkan data baru dari database. Namun, karena EF tidak melacak entitas yang ditanyakan AsNoTracking(), saya tidak dapat melakukan pembaruan apa pun pada data yang ditanyakan.

Apakah ada cara untuk memaksa EF mendapatkan data terbaru sambil melacak perubahan?

Saravana
sumber
2
29k penayangan dan hanya 19 suara positif untuk ini ... yah, saya tetap menambahkan milik saya
jleach

Jawaban:

152

Silakan coba ini untuk menyegarkan satu entitas:

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

Edit: Untuk mendapatkan data baru untuk kumpulan entitas ada baiknya mencoba membuang DbContextinstance setelah setiap permintaan.

PlTaylor
sumber
Terima kasih! Apakah ada cara untuk memuat ulang kumpulan entitas selain dari satu? Lebih disukai keseluruhan DbSet.
Saravana
Apakah ada hal lain yang Anda perlukan agar ini dianggap sebagai jawabannya?
PlTaylor
1
Ya, ini masih tidak menunjukkan cara memuat ulang koleksi entitas.
Saravana
1
Sudahkah Anda mencoba membuang konteks db Anda dan membuat yang baru?
PlTaylor
3
Butuh waktu berjam-jam untuk sampai pada kesimpulan ini. Itu EDIT di jawabannya adalah apa yang membantu saya menemukan solusi saya. Terima kasih!
BeemerGuy
17

Saya menemukan pertanyaan ini saat mencari solusi untuk masalah yang saya alami di mana properti navigasi tidak terisi setelah memperbarui entitas. Setiap kali saya mencoba memuat ulang entitas dari database, itu akan mengambil entri dari toko lokal sebagai gantinya yang tidak akan mengisi properti navigasi melalui pemuatan lambat. Alih-alih menghancurkan konteks dan membuatnya kembali, saya menemukan ini memungkinkan saya untuk mendapatkan data baru dengan proxy berfungsi:

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

Logika di baliknya adalah - pembaruan saya melampirkan entitas sehingga akan melacak perubahannya. Ini menambahkannya ke toko lokal. Setelah itu, setiap upaya untuk mengambil entitas dengan proksi fungsional akan mengakibatkannya mengambil entitas lokal alih-alih pergi ke db dan mengembalikan entitas baru yang diaktifkan proxy. Saya mencoba opsi muat ulang di atas, yang menyegarkan objek dari database, tetapi itu tidak memberi Anda objek yang di-proxy-kan dengan pemuatan lambat. Saya mencoba melakukan Find(id), Where(t => t.Id = id), First(t => t.Id = id). Akhirnya, saya memeriksa status yang tersedia yang disediakan dan melihat ada status "Terpisah". Eureka! Semoga ini bisa membantu seseorang.

Zach
sumber
Di mana Anda menerapkan status Terpisah agar pemuatan lambat berfungsi? Saya mencoba solusi Anda dan tidak berhasil untuk saya, saya pasti melewatkan sesuatu. Bantuan Anda akan sangat dihargai
Rex
2
Saya menemukan jawabannya: 1. simpan entitas, 2. setel status menjadi terpisah, 3. baca entitas dari db. Terima kasih atas petunjuknya!
Rex
1

Membuat kode berjalan pada konteks yang sama tidak akan menghasilkan entitas yang diperbarui. Ini hanya akan menambahkan entitas baru yang dibuat dalam database di antara proses. Muat ulang kekuatan EF bisa dilakukan seperti ini:

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

Saya mendeklarasikan variabel entitas, tanpa tugas, sebagai bagian dari kelas. Ini memungkinkan saya untuk membuang sebuah instance tanpa kehilangan variabel untuk referensi oleh metode lain. Saya baru saja menemukan ini sehingga tidak memiliki banyak runtime di bawah ikat pinggangnya, tetapi sejauh ini tampaknya berfungsi dengan baik.

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 ...
}
Skuter
sumber
0

Bagi saya ... Saya mengakses DbContext saya seperti ini:

_viewModel.Repo.Context

Untuk memaksa EF masuk ke database, saya melakukan ini:

_viewModel.Repo.Context = new NewDispatchContext();

Menimpa DbContext saat ini dengan instance baru. Kemudian lain kali saya menggunakan layanan data saya, mereka mendapatkan data dari database.

pdschuller.dll
sumber