Katakanlah saya menanyakan database dan memuat daftar item. Kemudian saya membuka salah satu item dalam bentuk tampilan detail, dan alih-alih membuat kueri ulang item tersebut dari database, saya membuat instance item dari sumber data dalam daftar.
Adakah cara agar saya dapat memperbarui catatan basis data tanpa mengambil catatan dari masing-masing item?
Berikut adalah contoh bagaimana saya melakukannya sekarang:
dataItem itemToUpdate = (from t in dataEntity.items
where t.id == id
select t).FirstOrDefault();
Kemudian setelah menarik catatan saya memperbarui beberapa nilai dalam item dan mendorong catatan kembali:
itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();
Saya akan berpikir akan ada cara yang lebih baik untuk melakukan ini, ada ide?
c#
entity-framework
Shane Grant
sumber
sumber
Jawaban:
Anda harus menggunakan metode Attach () .
Memasang dan Memisahkan Objek
sumber
Anda juga dapat menggunakan SQL langsung terhadap database menggunakan konteks datastore. Contoh:
Untuk alasan kinerja, Anda mungkin ingin meneruskan variabel daripada satu string SQL kode keras. Ini akan memungkinkan SQL Server untuk menyimpan kueri dan menggunakan kembali dengan parameter. Contoh:
UPDATE - untuk EF 6.0
sumber
ExecuteStoreCommand
sebenarnya bukan cara EF untuk melakukan ini, ini hanya menggunakan yangDbConnection
terkandung di dalamDbContext
untuk menjalankan perintah. Ini bukan database agnostik, apalagi persistence agnostic (contoh ini akan crash jika OP dialihkan ke XML).Kode:
Hasil TSQL:
catatan:
Baris "IsModified = true", diperlukan karena saat Anda membuat objek ExampleEntity baru (hanya dengan properti Id terisi) semua properti lainnya memiliki nilai default (0, null, dll). Jika Anda ingin memperbarui DB dengan "nilai default", perubahan tidak akan terdeteksi oleh kerangka entitas, dan kemudian DB tidak akan diperbarui.
Contoh:
tidak akan bekerja tanpa baris "IsModified = true", karena properti ExampleProperty sudah null saat Anda membuat objek ExampleEntity kosong, Anda perlu mengatakan kepada EF bahwa kolom ini harus diperbarui, dan inilah tujuan baris ini.
sumber
Jika kolom
DataItem
has EF akan melakukan pra-validasi (seperti kolom non-nullable), kita harus menonaktifkan validasi tersebut untuk konteks ini:Jika tidak, kami dapat mencoba memenuhi pra-validasi dan tetap hanya memperbarui kolom tunggal:
Dengan asumsi
dataEntity
adalah aSystem.Data.Entity.DbContext
Anda dapat memverifikasi kueri yang dihasilkan dengan menambahkan ini ke
DbContext
:sumber
Artikel ini sebagai bagian dari Microsoft's Getting Started menjelaskan status entitas dan cara melakukannya:
Tambahkan / Lampirkan dan Status Entitas
Lihat bagian 'Melampirkan entitas yang sudah ada tetapi dimodifikasi ke konteks'
Sekarang saya akan membaca sisa tutorial ini.
sumber
Ini bekerja agak berbeda di EF Core:
Mungkin ada cara yang lebih cepat untuk melakukan ini di EF Core, tetapi berikut ini memastikan UPDATE tanpa harus melakukan PILIHAN (diuji dengan EF Core 2 dan JET di .NET Framework 4.6.2):
Pastikan model Anda tidak memiliki properti IsRequired
Kemudian gunakan template berikut (di VB.NET):
sumber
Secara umum, jika Anda menggunakan Entity Framework untuk meminta semua item, dan Anda menyimpan objek entitas, Anda dapat memperbarui item individual di objek entitas dan menelepon
SaveChanges()
saat Anda selesai. Sebagai contoh:Pengambilan satu item yang Anda inginkan seharusnya tidak menghasilkan kueri baru.
sumber