Solusi termudah adalah menimpa SaveChanges
kelas entitas Anda. Anda dapat menangkap DbEntityValidationException
, membuka bungkusan kesalahan aktual dan membuat yang baru DbEntityValidationException
dengan pesan yang ditingkatkan.
- Buat kelas parsial di sebelah file SomethingSomething.Context.cs Anda.
- Gunakan kode di bagian bawah posting ini.
- Itu dia. Implementasi Anda akan secara otomatis menggunakan SaveChanges yang diganti tanpa kerja refactor.
Pesan pengecualian Anda sekarang akan terlihat seperti ini:
System.Data.Entity.Validation.DbEntityValidationException: Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut. Kesalahan validasi adalah: Field PhoneNumber harus berupa tipe string atau array dengan panjang maksimum '12'; Kolom LastName wajib diisi.
Anda bisa menjatuhkan SaveChanges yang ditimpa di kelas apa pun yang mewarisi dari DbContext
:
public partial class SomethingSomethingEntities
{
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
// Retrieve the error messages as a list of strings.
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
// Join the list to a single string.
var fullErrorMessage = string.Join("; ", errorMessages);
// Combine the original exception message with the new one.
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
// Throw a new DbEntityValidationException with the improved exception message.
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
}
The DbEntityValidationException
juga mengandung entitas yang menyebabkan kesalahan validasi. Jadi jika Anda memerlukan lebih banyak informasi, Anda dapat mengubah kode di atas untuk menampilkan informasi tentang entitas ini.
Lihat juga: http://devillers.nl/improving-dbentityvalidationexception/
using System.Linq;
Seperti yang ditunjukkan Martin, ada lebih banyak informasi dalam
DbEntityValidationResult
. Saya merasa berguna untuk mendapatkan nama kelas POCO dan nama properti saya di setiap pesan, dan ingin menghindari keharusan menulisErrorMessage
atribut khusus pada semua[Required]
tag saya hanya untuk ini.Tweak berikut untuk kode Martin menangani detail ini untuk saya:
sumber
SelectMany and Aggregate
di github oleh Daring CodersUntuk melihat
EntityValidationErrors
koleksi, tambahkan ekspresi Tontonan berikut ke jendela Tontonan.Saya menggunakan visual studio 2013
sumber
Saat Anda berada dalam mode debug dalam
catch {...}
blok, buka jendela "QuickWatch" ( ctrl+ alt+ q) dan tempel di sana:Ini akan memungkinkan Anda untuk menelusuri
ValidationErrors
pohon. Ini cara termudah yang saya temukan untuk mendapatkan wawasan instan tentang kesalahan ini.Untuk pengguna Visual 2012+ yang hanya peduli tentang kesalahan pertama dan mungkin tidak memiliki
catch
blok, Anda bahkan dapat melakukan:sumber
Untuk dengan cepat menemukan pesan kesalahan yang bermakna dengan memeriksa kesalahan selama debugging:
Tambahkan arloji cepat untuk:
Telusuri ke EntityValidationErrors seperti ini:
(item koleksi misalnya [0])> ValidationErrors> (item koleksi misalnya [0])> ErrorMessage
sumber
Sebenarnya, ini hanya masalah validasi, EF akan memvalidasi properti entitas terlebih dahulu sebelum membuat perubahan pada database. Jadi, EF akan memeriksa apakah nilai properti di luar kisaran, seperti ketika Anda mendesain meja. Table_Column_UserName adalah varchar (20). Tetapi, di EF, Anda memasukkan nilai yang lebih dari 20. Atau, dalam kasus lain, jika kolom tidak memungkinkan menjadi Null. Jadi, dalam proses validasi, Anda harus menetapkan nilai ke kolom bukan nol, tidak peduli apakah Anda akan melakukan perubahan padanya. Saya pribadi, suka jawaban Leniel Macaferi. Itu dapat menunjukkan kepada Anda detail masalah validasi
sumber
Saya pikir "Kesalahan validasi aktual" mungkin mengandung informasi sensitif, dan ini bisa menjadi alasan mengapa Microsoft memilih untuk meletakkannya di tempat lain (properti). Solusi yang ditandai di sini praktis, tetapi harus diambil dengan hati-hati.
Saya lebih suka membuat metode ekstensi. Lebih banyak alasan untuk ini:
sumber
Untuk Fungsi Azure kami menggunakan ekstensi sederhana ini ke Microsoft.Extensions.Logging.ILogger
dan contoh penggunaan:
sumber
Gunakan coba blok di kode Anda suka
Anda dapat memeriksa detailnya di sini juga
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut
http://blogs.infosupport.com/improving-dbentityvalidationexception/
sumber