Saya mengalami kesalahan ini saat menyemai database saya dengan pendekatan kode pertama.
Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut.
Sejujurnya saya tidak tahu bagaimana memeriksa konten kesalahan validasi. Visual Studio menunjukkan kepada saya bahwa itu adalah array dengan 8 objek, jadi 8 kesalahan validasi.
Ini bekerja dengan model saya sebelumnya, tetapi saya membuat beberapa perubahan yang saya jelaskan di bawah:
- Saya memiliki enum bernama Status, saya mengubahnya ke kelas yang disebut Status
- Saya mengubah kelas ApplicantsPositionHistory untuk memiliki 2 kunci asing ke tabel yang sama
Maafkan saya untuk kode yang panjang, tapi saya harus menempel semuanya. Pengecualian dilemparkan di baris terakhir dari kode berikut.
namespace Data.Model
{
public class Position
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int PositionID { get; set; }
[Required(ErrorMessage = "Position name is required.")]
[StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
[Display(Name = "Position name")]
public string name { get; set; }
[Required(ErrorMessage = "Number of years is required")]
[Display(Name = "Number of years")]
public int yearsExperienceRequired { get; set; }
public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
}
public class Applicant
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int ApplicantID { get; set; }
[Required(ErrorMessage = "Name is required")]
[StringLength(20, MinimumLength = 3, ErrorMessage="Name should not be longer than 20 characters.")]
[Display(Name = "First and LastName")]
public string name { get; set; }
[Required(ErrorMessage = "Telephone number is required")]
[StringLength(10, MinimumLength = 3, ErrorMessage = "Telephone should not be longer than 20 characters.")]
[Display(Name = "Telephone Number")]
public string telephone { get; set; }
[Required(ErrorMessage = "Skype username is required")]
[StringLength(10, MinimumLength = 3, ErrorMessage = "Skype user should not be longer than 20 characters.")]
[Display(Name = "Skype Username")]
public string skypeuser { get; set; }
public byte[] photo { get; set; }
public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
}
public class ApplicantPosition
{
[Key]
[Column("ApplicantID", Order = 0)]
public int ApplicantID { get; set; }
[Key]
[Column("PositionID", Order = 1)]
public int PositionID { get; set; }
public virtual Position Position { get; set; }
public virtual Applicant Applicant { get; set; }
[Required(ErrorMessage = "Applied date is required")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Display(Name = "Date applied")]
public DateTime appliedDate { get; set; }
[Column("StatusID", Order = 0)]
public int StatusID { get; set; }
public Status CurrentStatus { get; set; }
//[NotMapped]
//public int numberOfApplicantsApplied
//{
// get
// {
// int query =
// (from ap in Position
// where ap.Status == (int)Status.Applied
// select ap
// ).Count();
// return query;
// }
//}
}
public class Address
{
[StringLength(20, MinimumLength = 3, ErrorMessage = "Country should not be longer than 20 characters.")]
public string Country { get; set; }
[StringLength(20, MinimumLength = 3, ErrorMessage = "City should not be longer than 20 characters.")]
public string City { get; set; }
[StringLength(50, MinimumLength = 3, ErrorMessage = "Address should not be longer than 50 characters.")]
[Display(Name = "Address Line 1")]
public string AddressLine1 { get; set; }
[Display(Name = "Address Line 2")]
public string AddressLine2 { get; set; }
}
public class ApplicationPositionHistory
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int ApplicationPositionHistoryID { get; set; }
public ApplicantPosition applicantPosition { get; set; }
[Column("oldStatusID")]
public int oldStatusID { get; set; }
[Column("newStatusID")]
public int newStatusID { get; set; }
public Status oldStatus { get; set; }
public Status newStatus { get; set; }
[StringLength(500, MinimumLength = 3, ErrorMessage = "Comments should not be longer than 500 characters.")]
[Display(Name = "Comments")]
public string comments { get; set; }
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Display(Name = "Date")]
public DateTime dateModified { get; set; }
}
public class Status
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int StatusID { get; set; }
[StringLength(20, MinimumLength = 3, ErrorMessage = "Status should not be longer than 20 characters.")]
[Display(Name = "Status")]
public string status { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.IO;
namespace Data.Model
{
public class HRContextInitializer : DropCreateDatabaseAlways<HRContext>
{
protected override void Seed(HRContext context)
{
#region Status
Status applied = new Status() { status = "Applied" };
Status reviewedByHR = new Status() { status = "Reviewed By HR" };
Status approvedByHR = new Status() { status = "Approved by HR" };
Status rejectedByHR = new Status() { status = "Rejected by HR" };
Status assignedToTechnicalDepartment = new Status() { status = "Assigned to Technical Department" };
Status approvedByTechnicalDepartment = new Status() { status = "Approved by Technical Department" };
Status rejectedByTechnicalDepartment = new Status() { status = "Rejected by Technical Department" };
Status assignedToGeneralManager = new Status() { status = "Assigned to General Manager" };
Status approvedByGeneralManager = new Status() { status = "Approved by General Manager" };
Status rejectedByGeneralManager = new Status() { status = "Rejected by General Manager" };
context.Status.Add(applied);
context.Status.Add(reviewedByHR);
context.Status.Add(approvedByHR);
context.Status.Add(rejectedByHR);
context.Status.Add(assignedToTechnicalDepartment);
context.Status.Add(approvedByTechnicalDepartment);
context.Status.Add(rejectedByTechnicalDepartment);
context.Status.Add(assignedToGeneralManager);
context.Status.Add(approvedByGeneralManager);
context.Status.Add(rejectedByGeneralManager);
#endregion
#region Position
Position netdeveloper = new Position() { name = ".net developer", yearsExperienceRequired = 5 };
Position javadeveloper = new Position() { name = "java developer", yearsExperienceRequired = 5 };
context.Positions.Add(netdeveloper);
context.Positions.Add(javadeveloper);
#endregion
#region Applicants
Applicant luis = new Applicant()
{
name = "Luis",
skypeuser = "le.valencia",
telephone = "0491732825",
photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\1.jpg")
};
Applicant john = new Applicant()
{
name = "John",
skypeuser = "jo.valencia",
telephone = "3435343543",
photo = File.ReadAllBytes(@"C:\Users\LUIS.SIMBIOS\Documents\Visual Studio 2010\Projects\SlnHR\HRRazorForms\Content\pictures\2.jpg")
};
context.Applicants.Add(luis);
context.Applicants.Add(john);
#endregion
#region ApplicantsPositions
ApplicantPosition appicantposition = new ApplicantPosition()
{
Applicant = luis,
Position = netdeveloper,
appliedDate = DateTime.Today,
StatusID = 1
};
ApplicantPosition appicantposition2 = new ApplicantPosition()
{
Applicant = john,
Position = javadeveloper,
appliedDate = DateTime.Today,
StatusID = 1
};
context.ApplicantsPositions.Add(appicantposition);
context.ApplicantsPositions.Add(appicantposition2);
#endregion
context.SaveChanges(); --->> Error here
}
}
}
sumber
Console.WriteLine
, saya memperkirakan lebih banyak orang menulis proyek web kemudian menghibur aplikasi saat ini, danDebug.Write
bekerja di keduanya ...Anda dapat melakukannya dari Visual Studio selama debugging tanpa menulis kode apa pun, bahkan tidak menangkap blok.
Cukup tambahkan arloji dengan nama:
Ekspresi arloji
$exception
menampilkan pengecualian yang dilemparkan dalam konteks saat ini, bahkan jika itu belum ditangkap dan ditugaskan ke variabel.Berdasarkan http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/
sumber
Ini sebenarnya dapat melakukannya tanpa harus menulis kode:
Di blok tangkap Anda, tambahkan break point di baris kode berikut:
Sekarang jika Anda mengarahkan
exception
atau menambahkannya keWatch
dan kemudian masuk ke detail pengecualian seperti yang ditunjukkan di bawah ini; Anda akan melihat kolom mana yang menyebabkan masalah karena kesalahan ini biasanya terjadi ketika kendala tabel dilanggar ..Gambar besar
sumber
Inilah cara Anda dapat memeriksa konten EntityValidationErrors di Visual Studio (tanpa menulis kode tambahan) yaitu selama Debugging di IDE .
Masalah?
Anda benar, Popup debugger Visual Studio Lihat Detail tidak menunjukkan kesalahan aktual di dalam
EntityValidationErrors
koleksi.Solusinya!
Cukup tambahkan ekspresi berikut di jendela Quick Watch dan klik Reevaluate .
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Dalam kasus saya, lihat bagaimana saya dapat memperluas ke bagian
ValidationErrors
List
dalamEntityValidationErrors
koleksi: Referensi mattrandle.me posting blog , jawaban @ Yoel ini
sumber
Untuk cara cepat melihat kesalahan pertama tanpa menambahkan arloji Anda dapat menempel ini di Jendela Segera:
sumber
Bagi siapa saja yang bekerja di
VB.NET
sumber
Saat Anda dalam mode debug di dalam
catch {...}
blok, buka jendela "QuickWatch" ( ctrl+ alt+ q) dan tempel di sana:((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
atau:
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Jika Anda tidak mencoba / menangkap atau tidak memiliki akses ke objek pengecualian.
Ini akan memungkinkan Anda untuk menelusuri
ValidationErrors
pohon. Ini cara termudah yang saya temukan untuk mendapatkan wawasan instan tentang kesalahan ini.sumber
Jika Anda hanya menangkap pengecualian umum, mungkin bermanfaat bagi Anda untuk melemparkan ini sebagai DbEntityValidationException . Jenis pengecualian ini memiliki properti Kesalahan Validasi, dan terus memperluas jalan ke dalamnya, Anda akan menemukan semua masalah.
Misalnya, jika Anda memasukkan break point ke dalam tangkapan, Anda bisa melempar yang berikut ke arloji:
Contoh kesalahan adalah jika bidang tidak mengizinkan nol, dan Anda memiliki string nol, Anda akan melihatnya mengatakan bahwa bidang tersebut wajib diisi.
sumber
cukup Periksa Panjang Tabel Tabel Database Anda. Teks Input Anda Lebih Besar dari panjang jenis data kolom bidang
sumber
Dalam debug, Anda bisa memasukkan ini di bidang entri evaluator ekspresi QuickWatch Anda:
sumber
Jawaban dari @Slauma benar-benar hebat tetapi saya menemukan bahwa itu tidak berfungsi ketika properti ComplexType tidak valid.
Misalnya, Anda memiliki properti
Phone
tipe kompleksPhoneNumber
. JikaAreaCode
properti tidak valid, nama properti dive.PropertyNames
adalah "Phone.AreaCode". Ini menyebabkan panggilaneve.Entry.CurrentValues<object>(ve.PropertyName)
gagal.Untuk memperbaiki ini, Anda dapat membagi nama properti di masing-masing
.
, lalu mengulangi melalui array yang dihasilkan dari nama properti. Akhirnya, ketika Anda tiba di bagian bawah rantai, Anda cukup mengembalikan nilai properti.Di bawah ini adalah @ Slauma
FormattedDbEntityValidationException
kelas dengan dukungan untuk ComplexTypes.Nikmati!
sumber
Catatan yang
Entity.GetType().BaseType.Name
memberikan nama tipe yang Anda tentukan, bukan yang memiliki semua digit hex dalam namanya.sumber
Jawaban Per @ Slauma dan saran @ Milton Saya telah memperpanjang metode penyimpanan kustom kelas dasar kami dengan try / catch yang akan menangani (dan karenanya login kesalahan log kami!) Semacam pengecualian ini.
sumber
Saya harus menulis ini di jendela Segera: 3
untuk mengetahui kesalahan yang sebenarnya!
sumber
Menggunakan jawaban @Slauma saya telah membuat potongan kode (surround dengan potongan) untuk penggunaan yang lebih baik.
sumber
Tangkap pengecualian dalam try catch dan kemudian tonton cepat atau ctrl + d & ctrl + q dan Anda dapat menelusuri EntityValidationErrors.
sumber
Hanya melempar dua sen saya ke ...
Dalam dbConfiguration.cs saya, saya ingin membungkus metode context.SaveChanges () saya menjadi try / catch dan menghasilkan file teks keluaran yang memungkinkan saya untuk membaca Kesalahan dengan jelas, dan kode ini juga mencatat waktu mereka - berguna jika Anda mengalami lebih dari satu kesalahan pada waktu yang berbeda!
sumber
Apa yang saya temukan ... ketika saya mendapatkan kesalahan 'EntityValidationErrors' adalah bahwa .... saya memiliki bidang dalam database saya 'db1' dalam tabel 'tbladdress' sebagai 'address1' yang memiliki ukuran 100 (yaitu alamat varchar (100) null) dan saya memberikan nilai lebih dari 100 karakter..dan ini menyebabkan kesalahan saat menyimpan data ke basis data ....
Jadi, Anda harus Periksa data yang Anda berikan ke bidang.
sumber
not null
kolom jadi setelah saya menambahkan data ke semua elemen sebelum sayadb.SaveChanges()
saya tidak menerima kesalahan.Ini bekerja untuk saya.
Beri breakpoint pada pernyataan if. Kemudian Anda dapat memeriksa modelState di jendela debug. Pada setiap nilai Anda dapat melihat apakah ada kesalahan dan bahkan pesan kesalahan. Itu dia. Ketika Anda tidak membutuhkannya lagi, cukup hapus atau komentari baris tersebut.
Saya harap ini akan membantu.
Jika ditanya, saya dapat memberikan tangkapan layar terperinci di jendela debug.
sumber
Seperti disebutkan dalam posting lain, cukup tangkap pengecualian di kelas DbEntityValidationException. Yang akan memberi Anda apa pun yang Anda butuhkan selama kasus kesalahan.
sumber
Saya menghadapi kesalahan ini sebelumnya
ketika saya mencoba untuk memperbarui bidang tertentu dalam model saya dalam bingkai entitas
dan menurut jawaban di atas
Saya menemukan pesan Validasi
The SignerName field is required.
yang menunjuk ke bidang dalam model saya
dan ketika saya memeriksa skema database saya, saya menemukan
jadi off coure
ValidationException
memiliki hak untuk menaikkandan menurut bidang ini saya ingin nullable, (Saya tidak tahu bagaimana saya mengacaukannya)
jadi saya mengubah bidang itu untuk memungkinkan Null, dan dengan ini kode saya tidak akan memberi saya kesalahan ini lagi
sumber
DbEntityValidationException
mengangkat.Silakan periksa nilai bidang yang Anda lewati, apakah valid dan sesuai dengan bidang basis data. Misalnya jumlah karakter yang diteruskan dalam bidang tertentu kurang dari karakter yang ditentukan dalam bidang tabel database.
sumber
Jika Anda menggunakan IIS dengan Windows Authentication and Entity Framework , berhati-hatilah untuk menggunakannya
authorize
.Saya mencoba
POST
tanpa otorisasi dan itu tidak berhasil, dan mendapatkan kesalahan inidb.SaveChangesAsync();
, sementara semua kata kerjaGET
dan lainnyaDELETE
sedang bekerja.Tetapi ketika saya menambahkan AuthorizeAttribute sebagai anotasi, itu berhasil.
sumber
Berikut cara lain untuk melakukannya daripada menggunakan foreach loop untuk mencari di dalam EntityValidationErrors. Tentu saja Anda dapat memformat pesan sesuai keinginan Anda:
sumber
Dalam kasus saya itu karena panjang bidang basis data kurang dari panjang bidang masukan.
tabel basis data
Masukan saya
nilai untuk
Username
length
adalah 5 yanglessthan
6... ini dapat membantu seseorang
sumber
Periksa apakah Anda memiliki
Not Null
kendala dalam kolom tabel Anda dan Anda tidak melewati nilai untuk kolom itu saat memasukkan / Perbarui operasi. Itu menyebabkan pengecualian ini dalam kerangka entitas.sumber
Saya juga menghadapi masalah yang sama. Saya memperbarui .edmx saya dari database setelah itu pengecualian telah hilang.
sumber
Kesalahan ini terjadi terutama karena ukuran bidang. Periksa semua ukuran bidang dalam tabel database.
sumber
Juga berjuang dengan kesalahan ini dan berdasarkan pada topik di sini dan jawaban ini dapat menemukan potongan untuk menyalin / menempel tanpa perlu mencari tahu apa yang harus diimpor (sangat baik untuk pemula C #), kode di bawah ini:
sumber