Saya memiliki kelas berikut yang dihasilkan oleh kerangka entitas:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Saya ingin menjadikan ini bidang wajib
[Required]
public int RequestId { get;set; }
Namun, karena ini adalah kode yang dihasilkan, ini akan terhapus. Saya tidak dapat membayangkan cara untuk membuat kelas parsial karena properti ditentukan oleh kelas parsial yang dihasilkan. Bagaimana saya bisa mendefinisikan kendala dengan cara yang aman?
c#
entity-framework
asp.net-mvc-4
P. Brian.Mackey
sumber
sumber
Jawaban:
Kelas yang dihasilkan
ItemRequest
akan selalu menjadipartial
kelas. Ini memungkinkan Anda untuk menulis kelas parsial kedua yang ditandai dengan anotasi data yang diperlukan. Dalam kasus Anda, kelas parsialItemRequest
akan terlihat seperti ini:sumber
Seperti yang dijawab MUG4N, Anda dapat menggunakan kelas parsial tetapi akan lebih baik menggunakan antarmuka sebagai gantinya. Dalam hal ini Anda akan mengalami kesalahan kompilasi jika model EF tidak sesuai dengan model validasi. Jadi, Anda dapat memodifikasi model EF Anda tanpa takut aturan validasi sudah usang.
PS Jika Anda menggunakan jenis proyek yang berbeda dari ASP.NET MVC (saat Anda melakukan validasi data manual) jangan lupa untuk mendaftarkan validator Anda
sumber
Saya menemukan solusi seperti jawaban MUG4N , tetapi sebaliknya, menumpuk
MetaData
kelas dalam kelas entitas, sehingga mengurangi jumlah kelas dalam daftar ruang nama publik Anda, dan menghilangkan kebutuhan untuk memiliki nama unik untuk setiap kelas metadata.sumber
[NotMapped]
di dalam kelas parsial juga ketika saya membutuhkannya.Ini semacam ekstensi untuk jawaban @dimonser jika Anda meregenerasi model db Anda, Anda harus menambahkan kembali antarmuka secara manual pada kelas-kelas itu.
Jika Anda ingin melakukannya, Anda juga dapat memodifikasi
.tt
template Anda :Berikut adalah contoh antarmuka yang dibuat secara otomatis pada beberapa kelas, ini adalah fragmen dari
.tt
hanya menggantiEntityClassOpening
metode di milik Anda dengan mengikuti (dan jelasvar stringsToMatch
dengan nama entitas dan antarmuka Anda).Tidak ada orang normal yang boleh melakukan ini pada dirinya sendiri, telah dibuktikan dalam Alkitab bahwa seseorang pergi ke Neraka untuk ini.
sumber
Saya tidak yakin bagaimana melakukan apa yang Anda minta tetapi ada jalan lain. Validasi data dinamis dengan mengganti GetValidators dari DataAnnotationsModelValidatorProvider kustom Anda. Di dalamnya Anda dapat membaca aturan untuk memvalidasi setiap bidang (dari database, file konfigurasi, dll.) Dan menambahkan validator sesuai kebutuhan. Ini memiliki nilai tambah bahwa validasi Anda tidak lagi digabungkan dengan model dan dapat diubah bahkan tanpa perlu memulai ulang situs. Tentu saja ini mungkin berlebihan untuk kasus Anda, tetapi itu ideal untuk kami!
sumber
Ubah template T4 dengan menambahkan penjelasan yang diperlukan, file ini biasanya bernama MODELNAME.tt
temukan di mana T4 membuat kelas dan metode untuk mengetahui di mana meletakkannya.
Anda juga perlu menambahkan ruang nama;
Bangun kembali kelas Anda dengan menyimpan model Anda, semua metode Anda harus dianotasi.
sumber