Adakah cara "elegan" untuk memberikan properti default nilai default?
Mungkin oleh DataAnnotations, sesuatu seperti:
[DefaultValue("true")]
public bool Active { get; set; }
Terima kasih.
entity-framework
ef-code-first
default-value
marino-krk
sumber
sumber
this.Active = true;
? Saya pikir nilai DB akan diutamakan saat mengambil, tapi hati-hati jika baru kemudian lampirkan entitas untuk pembaruan tanpa mengambil pertama, karena pelacakan perubahan mungkin melihat ini ketika Anda ingin memperbarui nilai. Komentar karena saya belum pernah menggunakan EF dalam waktu yang lama, dan saya merasa ini adalah kesempatan yang sulit.public bool Inactive { get; set; }
😉Jawaban:
Anda dapat melakukannya dengan mengedit kode migrasi terlebih dahulu secara manual:
sumber
Active
untuktrue
saat membuatEvent
objek juga. Nilai default selalu beradafalse
pada properti bool yang tidak dapat dibatalkan, jadi kecuali diubah, ini adalah kerangka kerja entitas yang akan disimpan ke db. Atau apakah saya melewatkan sesuatu?Sudah lama, tetapi meninggalkan catatan untuk orang lain. Saya mencapai apa yang dibutuhkan dengan atribut dan saya menghiasi bidang kelas model saya dengan atribut yang saya inginkan.
Mendapat bantuan dari 2 artikel ini:
Apa yang saya lakukan:
Tentukan Atribut
Dalam "OnModelCreating" dari konteksnya
Di SqlGenerator kustom
Kemudian di konstruktor Konfigurasi Migrasi, daftarkan generator SQL khusus.
sumber
[SqlDefaultValue(DefaultValue = "getutcdate()")]
setiap entitas. 1) Cukup hapusmodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) TambahmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Jawaban di atas sangat membantu, tetapi hanya memberikan sebagian dari solusi. Masalah utama adalah bahwa segera setelah Anda menghapus atribut nilai Default, batasan pada kolom dalam database tidak akan dihapus. Jadi nilai default sebelumnya akan tetap berada di database.
Berikut ini adalah solusi lengkap untuk masalah ini, termasuk penghapusan kendala SQL pada penghapusan atribut. Saya juga menggunakan kembali
DefaultValue
atribut asli .NET Framework .Pemakaian
Agar ini berfungsi, Anda perlu memperbarui file IdentityModels.cs dan Configuration.cs
File IdentityModels.cs
Tambahkan / perbarui metode ini di
ApplicationDbContext
kelas AndaFile Configuration.cs
Perbarui
Configuration
konstruktor kelas Anda dengan mendaftarkan generator Sql khusus, seperti ini:Selanjutnya, tambahkan kelas generator Sql khusus (Anda dapat menambahkannya ke file Configuration.cs atau file terpisah)
sumber
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
atribut? Jika demikian, mengapa? Dalam tes saya sepertinya tidak berpengaruh meninggalkannya.Properti model Anda tidak harus menjadi 'properti otomatis' Meskipun itu lebih mudah. Dan atribut DefaultValue benar-benar hanya metadata informatif. Jawaban yang diterima di sini adalah salah satu alternatif dari pendekatan konstruktor.
vs.
Ini hanya akan berfungsi untuk aplikasi yang membuat dan menggunakan data menggunakan kelas khusus ini. Biasanya ini bukan masalah jika kode akses data terpusat. Untuk memperbarui nilai di semua aplikasi, Anda perlu mengkonfigurasi sumber data untuk menetapkan nilai default. Jawaban Devi menunjukkan bagaimana hal itu dapat dilakukan dengan menggunakan migrasi, sql, atau bahasa apa pun yang digunakan oleh sumber data Anda.
sumber
Apa yang saya lakukan, saya menginisialisasi nilai dalam konstruktor entitas
Catatan: Atribut DefaultValue tidak akan menetapkan nilai properti Anda secara otomatis, Anda harus melakukannya sendiri
sumber
Setelah komentar @SedatKapanoglu, saya menambahkan semua pendekatan saya yang berfungsi, karena dia benar, hanya menggunakan API yang lancar tidak bekerja.
1- Buat pembuat kode khusus dan ganti Generate untuk ColumnModel.
2- Tetapkan pembuat kode baru:
3- Gunakan api lancar untuk membuat Anotasi:
sumber
Itu mudah! Hanya perlu penjelasan.
migrasi yang dihasilkan adalah:
Jika Anda ingin true, ubah DefaultValue menjadi true dalam migrasi sebelum memperbarui database
sumber
true
?Saya akui bahwa pendekatan saya lolos dari keseluruhan konsep "Code First". Tetapi jika Anda memiliki kemampuan untuk hanya mengubah nilai default di tabel itu sendiri ... itu jauh lebih sederhana daripada panjang yang harus Anda lalui di atas ... Saya terlalu malas untuk melakukan semua itu bekerja!
Tampaknya seolah-olah ide-ide asli poster akan berhasil:
Saya pikir mereka hanya membuat kesalahan dengan menambahkan tanda kutip ... tapi sayangnya tidak ada intuisi seperti itu. Saran lain terlalu banyak bagi saya (mengingat saya memiliki hak istimewa yang diperlukan untuk masuk ke meja dan membuat perubahan ... di mana tidak setiap pengembang akan dalam setiap situasi). Pada akhirnya saya hanya melakukannya dengan cara kuno. Saya menetapkan nilai default dalam tabel SQL Server ... Maksud saya benar-benar, sudah cukup! CATATAN: Saya selanjutnya diuji melakukan add-migrasi dan pembaruan-database dan perubahan macet.
sumber
Hanya Membebani konstruktor default kelas Model dan melewati parameter terkait yang mungkin Anda gunakan atau tidak. Dengan ini, Anda dapat dengan mudah memberikan nilai default untuk atribut. Di bawah ini adalah contohnya.
sumber
Mari kita anggap Anda memiliki nama kelas bernama Produk dan Anda memiliki bidang IsActive. Anda hanya perlu membuat konstruktor:
Maka nilai default IsActive Anda adalah Benar!
Edite :
jika Anda ingin melakukan ini dengan SQL, gunakan perintah ini:
sumber
Di EF core yang dirilis 27 Juni 2016 Anda dapat menggunakan API yang lancar untuk menetapkan nilai default. Pergi ke kelas ApplicationDbContext, cari / buat nama metode OnModelCreating dan tambahkan API lancar berikut.
sumber
Di .NET Core 3.1 Anda dapat melakukan hal berikut di kelas model:
Di DbContext OnModelCreating Anda menambahkan nilai default.
Menghasilkan berikut dalam database
Catatan: Jika Anda tidak memiliki properti nullable (bool?) Untuk Anda, Anda akan mendapatkan peringatan berikut
sumber
Saya menemukan bahwa hanya menggunakan Auto-Property Initializer pada properti entitas sudah cukup untuk menyelesaikan pekerjaan.
Sebagai contoh:
sumber
Hmm ... Saya melakukan DB terlebih dahulu, dan dalam hal ini, ini sebenarnya jauh lebih mudah. EF6 bukan? Cukup buka model Anda, klik kanan pada kolom yang ingin Anda tetapkan default, pilih properti, dan Anda akan melihat bidang "DefaultValue". Cukup isi dan simpan. Ini akan mengatur kode untuk Anda.
Jarak tempuh Anda mungkin bervariasi pada kode terlebih dahulu, saya belum bekerja dengan itu.
Masalah dengan banyak solusi lain, adalah bahwa meskipun mereka dapat bekerja pada awalnya, segera setelah Anda membangun kembali model, itu akan membuang kode kustom apa pun yang Anda masukkan ke file yang dihasilkan mesin.
Metode ini berfungsi dengan menambahkan properti tambahan ke file edmx:
Dan dengan menambahkan kode yang diperlukan ke konstruktor:
sumber
Tetapkan nilai default untuk kolom dalam tabel di MSSQL Server, dan dalam atribut class code add, seperti ini:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
untuk properti yang sama.
sumber