Saya memiliki masalah dengan Kerangka Entitas di Asp.net. Saya ingin mendapatkan nilai Id setiap kali saya menambahkan objek ke database. Bagaimana saya bisa melakukan ini?
c#
entity-framework
entity
ahmet
sumber
sumber
SaveChanges
langsung hanya untuk mendapatkan id. Bacaan lebih lanjut di sini .Jawaban:
Ini sangat mudah. Jika Anda menggunakan DB yang dihasilkan Id (seperti
IDENTITY
dalam MS SQL) Anda hanya perlu menambahkan entitas keObjectSet
danSaveChanges
pada yang terkaitObjectContext
.Id
akan secara otomatis diisi untuk Anda:Kerangka kerja entitas secara default mengikuti masing
INSERT
- masing denganSELECT SCOPE_IDENTITY()
ketikaId
s dihasilkan otomatis digunakan.sumber
Saya telah menggunakan jawaban Ladislav Mrnka untuk berhasil mengambil Id ketika menggunakan Entity Framework namun saya memposting di sini karena saya telah salah menggunakannya (yaitu menggunakannya di tempat yang tidak diperlukan) dan berpikir saya akan memposting temuan saya di sini di- jika orang mencari untuk "memecahkan" masalah yang saya miliki.
Pertimbangkan objek Pesanan yang memiliki hubungan kunci asing dengan Pelanggan. Ketika saya menambahkan pelanggan baru dan pesanan baru pada saat yang sama saya melakukan sesuatu seperti ini;
Namun dalam kasus saya ini tidak diperlukan karena saya memiliki hubungan kunci asing antara pelanggan. Id dan pesanan. Pelanggan
Yang harus saya lakukan adalah ini;
Sekarang ketika saya menyimpan perubahan, id yang dibuat untuk pelanggan juga ditambahkan ke pesanan. Saya tidak perlu untuk langkah-langkah tambahan
Saya sadar ini tidak menjawab pertanyaan awal tetapi berpikir itu mungkin membantu pengembang yang baru mengenal EF dari menggunakan terlalu banyak jawaban terpilih untuk sesuatu yang mungkin tidak diperlukan.
Ini juga berarti bahwa pembaruan selesai dalam satu transaksi tunggal, berpotensi menghindari data orphin (baik semua pembaruan selesai, atau tidak ada yang dilakukan).
sumber
Anda harus memuat ulang entitas setelah menyimpan perubahan. Karena telah diubah oleh pemicu basis data yang tidak dapat dilacak oleh EF. SO kita perlu memuat kembali entitas dari DB,
Kemudian
Lihatlah jawaban @jayantha dalam pertanyaan di bawah ini:
Bagaimana saya bisa mendapatkan Id entitas yang dimasukkan dalam kerangka Entity saat menggunakan defaultValue?
Mencari jawaban Kristen di pertanyaan di bawah ini juga dapat membantu:
Kerangka Entitas Segarkan konteks?
sumber
.GetDatabaseValues();
jika Anda baru saja menyimpan model Anda ke DB. ID harus terisi kembali ke model secara otomatis.GetDatabaseValues()
jika tidak tahu ID objek yang akan dicari dalam database?Silakan merujuk tautan ini.
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
Anda harus mengatur properti StoreGeneratedPattern ke identitas dan kemudian coba kode Anda sendiri.
Atau Anda juga bisa menggunakan ini.
sumber
StoreGeneratedPattern
adalah bagian yang hilang untuk saya.Objek yang Anda simpan harus memiliki yang benar
Id
setelah menyebarkan perubahan ke dalam basis data.sumber
Anda bisa mendapatkan ID hanya setelah menyimpan, sebagai gantinya Anda dapat membuat Guid baru dan menetapkan sebelum menyimpan.
sumber
Saya menemukan situasi di mana saya perlu memasukkan data dalam database & secara bersamaan memerlukan id primer menggunakan kerangka entitas. Solusi:
sumber
Semua jawaban sangat cocok untuk skenario mereka sendiri, yang saya lakukan berbeda adalah bahwa saya menetapkan int PK langsung dari objek (TEntity) yang Tambah () kembali ke variabel int seperti ini;
jadi alih-alih membuat keseluruhan objek baru, Anda hanya mengambil apa yang Anda inginkan :)
EDIT Untuk Tn. @GertArnold:
sumber
Add
(jika iniDbSet.Add
) tidak secara ajaib memberikan nilaiEmployeeId
.SaveChanges
. Mustahil. Kecuali Anda memiliki beberapa proses lain yang ditugaskanEmployeeId
, misalnya dalamEmployee
konstruktor. ATAU Anda menggunakan inti EFForSqlServerUseSequenceHiLo
. Bagaimanapun, Anda tidak memberikan gambaran keseluruhan.Ini akan bekerja
sumber
Repository
itu. Dan "ini akan berhasil" adalah beberapa penjelasan !.Ada dua strategi:
Gunakan Database yang dihasilkan
ID
(int
atauGUID
)Cons:
Anda harus melakukan
SaveChanges()
untuk mendapatkanID
entitas yang baru saja disimpan.Pro:
Dapat menggunakan
int
identitas.Gunakan klien yang dihasilkan
ID
- hanya GUID.Pro: Minifikasi
SaveChanges
operasi. Mampu menyisipkan grafik besar objek baru per satu operasi.Cons:
Hanya diizinkan untuk
GUID
sumber
Saat Anda menggunakan kode EF 6.x terlebih dahulu
dan menginisialisasi tabel database, itu akan meletakkan
di dalam properti tabel di bawah Nilai Default tajuk atau Binding, memungkinkan ID untuk diisi saat dimasukkan.
Masalahnya adalah jika Anda membuat tabel dan menambahkan
bagian nanti, basis data pembaruan masa depan tidak akan menambah kembali (new followingentialid ())
Untuk memperbaiki cara yang tepat adalah dengan menghapus migrasi, menghapus database dan migrasi kembali ... atau Anda bisa menambahkan (new followingentialid ()) ke dalam desainer tabel.
sumber
when -column- is NULL, then NEWID()