Saya telah bekerja dengan Entity Framework 4 baru-baru ini, dan saya sedikit bingung kapan harus menggunakan ObjectSet.Attach , dan ObjectSet.AddObject .
Dari pengertian saya:
- Gunakan "Lampirkan" ketika Entitas sudah ada di sistem
- Gunakan "AddObject" saat membuat Entitas baru
Jadi, jika saya membuat Orang baru , saya melakukan ini.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Jika saya memodifikasi Orang yang ada , saya melakukan ini:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Perlu diingat, ini adalah contoh yang sangat sederhana . Pada kenyataannya saya menggunakan Pure POCO (tanpa pembuatan kode), pola Repositori (tidak berurusan dengan ctx.Persons), dan Unit Kerja (jangan berurusan dengan ctx.SaveChanges). Tetapi "di bawah penutup", di atas adalah apa yang terjadi dalam implementasi saya.
Sekarang, pertanyaan saya - saya belum menemukan skenario di mana saya harus menggunakan Lampirkan .
Apa yang kulewatkan di sini? Kapan kita perlu menggunakan Lampirkan?
EDIT
Sekedar klarifikasi, saya sedang mencari contoh kapan harus menggunakan Lampirkan di atas AddObject (atau sebaliknya).
EDIT 2
Jawaban di bawah ini benar (yang saya terima), tetapi saya pikir saya akan menambahkan contoh lain di mana Attach akan berguna.
Dalam contoh saya di atas untuk memodifikasi Orang yang ada , dua pertanyaan sebenarnya sedang dieksekusi.
Satu untuk mengambil Person (.SingleOrDefault), dan satu lagi untuk melakukan UPDATE (.SaveChanges).
Jika (karena alasan tertentu), saya sudah tahu bahwa "Joe Bloggs" ada di sistem, mengapa melakukan permintaan tambahan untuk mendapatkannya terlebih dahulu? Saya bisa melakukan ini:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Ini akan menghasilkan hanya pernyataan UPDATE yang dieksekusi.
sumber
Jawaban:
ObjectContext.AddObject dan ObjectSet.AddObject :
The AddObject metode adalah untuk menambahkan objek baru dibuat yang tidak ada dalam database. Entitas akan mendapatkan EntityKey sementara yang dihasilkan secara otomatisdan EntityState akan diatur ke Ditambahkan . Ketika SaveChanges dipanggil, akan jelas bagi EF bahwa entitas ini perlu dimasukkan ke dalam basis data.
ObjectContext.Attach dan ObjectSet.Attach :
Di sisi lain, Attach digunakan untuk entitas yang sudah ada dalam database. Daripada mengatur EntityState ke Ditambahkan, Lampirkan hasil dalamEntityState Tidak Berubah , yang berarti itu tidak berubah sejak itu melekat pada konteks. Objek yang Anda lampirkan diasumsikan ada di database. Jika Anda memodifikasi objek setelah mereka dilampirkan, ketika Anda memanggil SaveChanges nilai dari EntityKey digunakan untuk memperbarui (atau menghapus) baris yang sesuai dengan menemukan ID yang cocok di tabel db.
Selanjutnya, menggunakan metode Lampirkan, Anda bisa menentukan hubungan antara entitas yang sudah ada di ObjectContext tetapi yang adabelum terhubung secara otomatis. Pada dasarnya tujuan utama Lampirkan, adalah untuk menghubungkan entitas yang sudah dilampirkan ke ObjectContext dan bukan baru sehingga Anda tidak dapat menggunakan Lampirkan untuk melampirkan entitas yang EntityState ditambahkan. Anda harus menggunakan Tambah () dalam kasus ini.
Misalnya, anggap entitas Orang Anda memiliki properti navigasi bernama Alamat yang merupakan kumpulanentitas Alamat . Katakanlah Anda telah membaca kedua Objek dari konteks, tetapi mereka tidak terkait satu sama lain dan Anda ingin membuatnya jadi:
sumber
Ini adalah respons yang terlambat tetapi mungkin membantu orang lain yang menemukan ini.
Pada dasarnya, entitas "terputus" dapat terjadi ketika Anda memanipulasi entitas di luar lingkup "menggunakan".
Jika Anda memasukkan lingkup "using" yang lain maka variabel "e" akan terputus karena ia termasuk dalam lingkup "using" sebelumnya dan karena lingkup "using" sebelumnya dihancurkan maka "e" terputus.
Begitulah cara saya memahaminya.
sumber
Ini adalah kutipan dari Kerangka Kerja Entitas Pemrograman: DbContext
sumber
Bagaimana dengan hanya merujuk ke kunci utama alih-alih melampirkan?
yaitu:
sumber