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 DbContext
lagi 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?
c#
asp.net-mvc
entity-framework
dbcontext
Saravana
sumber
sumber
Jawaban:
Silakan coba ini untuk menyegarkan satu entitas:
Edit: Untuk mendapatkan data baru untuk kumpulan entitas ada baiknya mencoba membuang
DbContext
instance setelah setiap permintaan.sumber
DbSet
.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:
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.sumber
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();
sumber
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 ... }
sumber
Bagi saya ... Saya mengakses DbContext saya seperti ini:
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.
sumber