Saya ingin menyimpan Edit ke Database dan saya menggunakan Entity FrameWork Code-First di ASP.NET MVC 3 / C # tetapi saya mendapatkan kesalahan. Di kelas Event saya, saya memiliki tipe data DateTime dan TimeSpan tetapi dalam database saya, saya masing-masing memiliki Date dan time. Dapatkah ini menjadi alasan? Bagaimana saya bisa melakukan cast ke tipe data yang sesuai dalam kode sebelum menyimpan perubahan ke database.
public class Event
{
public int EventId { get; set; }
public int CategoryId { get; set; }
public int PlaceId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public DateTime EventDate { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public string Description { get; set; }
public string EventPlaceUrl { get; set; }
public Category Category { get; set; }
public Place Place { get; set; }
}
Metode di controller >>>> Masalah di storeDB.SaveChanges ();
// POST: /EventManager/Edit/386
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
var theEvent = storeDB.Events.Find(id);
if (TryUpdateModel(theEvent))
{
storeDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.Categories = storeDB.Categories.OrderBy(g => g.Name).ToList();
ViewBag.Places = storeDB.Places.OrderBy(a => a.Name).ToList();
return View(theEvent);
}
}
dengan
public class EventCalendarEntities : DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Place> Places { get; set; }
}
Database SQL Server 2008 R2 / T-SQL
EventDate (Datatype = date)
StartTime (Datatype = time)
EndTime (Datatype = time)
Formulir Http
EventDate (Datatype = DateTime) e.g. 4/8/2011 12:00:00 AM
StartTime (Datatype = Timespan/time not sure) e.g. 08:30:00
EndTime (Datatype = Timespan/time not sure) e.g. 09:00:00
Kesalahan Server dalam Aplikasi '/'.
Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut.
Deskripsi: Pengecualian yang tidak ditangani terjadi selama eksekusi permintaan web saat ini. Harap tinjau jejak tumpukan untuk informasi lebih lanjut tentang kesalahan dan dari mana asalnya dalam kode.
Detail Pengecualian: System.Data.Entity.Validation.DbEntityValidationException: Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut.
Kesalahan Sumber:
Line 75: if (TryUpdateModel(theEvent))
Line 76: {
Line 77: storeDB.SaveChanges();
Line 78: return RedirectToAction("Index");
Line 79: }
Sumber File: C: \ sep \ MvcEventCalendar \ MvcEventCalendar \ Controllers \ EventManagerController.cs Baris: 77
Jejak Tumpukan:
[DbEntityValidationException: Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut.]
sumber
Jawaban:
Anda dapat mengekstrak semua informasi dari
DbEntityValidationException
dengan kode berikut (Anda perlu menambahkan ruang nama:System.Data.Entity.Validation
danSystem.Diagnostics
keusing
daftar Anda ):sumber
Required
). Saya telah menambahkan jawaban dengan sedikit info lebih lanjut.Tidak diperlukan perubahan kode:
Saat Anda berada dalam mode debug dalam
catch {...}
blok, buka jendela "QuickWatch" ( Ctrl+ Alt+ Q) dan tempel di sana:atau:
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 memiliki kelas dengan nama properti yang sama, berikut adalah sedikit ekstensi untuk jawaban Praveen:
sumber
Sebagai peningkatan untuk Praveen dan Tony, saya menggunakan penggantian:
sumber
Implementasi ini membungkus pengecualian entitas dengan pengecualian dengan teks detail. Ini menangani
DbEntityValidationException
,DbUpdateException
,datetime2
kesalahan range (MS SQL), dan termasuk kunci entitas tidak valid dalam pesan (berguna ketika savind banyak entitas pada satuSaveChanges
panggilan).Pertama, menimpa
SaveChanges
di kelas DbContext:Kelas ExceptionHelper:
sumber
Kode ini membantu menemukan masalah saya ketika saya memiliki masalah dengan Entitas VAlidation Erros saya. Itu memberi tahu saya masalah yang tepat dengan Definisi Entitas saya. Coba kode berikut di mana Anda perlu untuk menutupi storeDB.SaveChanges (); dalam mengikuti coba tangkap blok.
sumber
Saya mendapatkan kesalahan ini hari ini dan tidak bisa menyelesaikannya untuk sementara waktu, tetapi saya menyadari itu setelah menambahkan beberapa
RequireAttribute
ke model saya dan bahwa beberapa data seed pengembangan tidak mengisi semua bidang yang diperlukan.Jadi hanya sebuah catatan bahwa jika Anda mendapatkan kesalahan ini sementara memperbarui database melalui semacam strategi init seperti
DropCreateDatabaseIfModelChanges
maka Anda harus memastikan bahwa data unggulan Anda memenuhi dan memenuhi semua atribut validasi data model .Saya tahu ini sedikit berbeda dengan masalah dalam pertanyaan, tetapi ini adalah pertanyaan yang populer jadi saya pikir saya akan menambahkan sedikit lebih banyak untuk jawaban bagi orang lain yang memiliki masalah yang sama seperti saya.
Semoga ini bisa membantu orang lain :)
sumber
Saya pikir menambahkan try / catch untuk setiap
SaveChanges()
operasi bukanlah praktik yang baik, lebih baik memusatkan ini:Tambahkan kelas ini ke
DbContext
kelas utama :Ini akan menimpa
SaveChanges()
metode konteks Anda dan Anda akan mendapatkan daftar yang dipisahkan koma yang berisi semua kesalahan validasi entitas.ini juga dapat ditingkatkan, untuk mencatat kesalahan dalam produksi env, bukan hanya membuang kesalahan.
semoga ini membantu.
sumber
DbContext
terhadap proyek Anda.Berikut ini ekstensi untuk ekstensi Tony ... :-)
Untuk Entity Framework 4.x, jika Anda ingin mendapatkan nama dan nilai bidang kunci sehingga Anda tahu instance entitas mana (catatan DB) yang memiliki masalah, Anda bisa menambahkan yang berikut ini. Ini memberikan akses ke anggota kelas ObjectContext yang lebih kuat dari objek DbContext Anda.
sumber
Saya tidak suka pengecualian, saya mendaftarkan OnSaveChanges dan memilikinya
sumber
Kesalahan ini juga terjadi ketika Anda mencoba untuk menyimpan entitas yang memiliki kesalahan validasi. Cara yang baik untuk menyebabkan ini adalah lupa memeriksa ModelState.IsValid sebelum menyimpan ke DB Anda.
sumber
Pastikan bahwa jika Anda memiliki nvarchar (50) di baris DB Anda tidak mencoba memasukkan lebih dari 50 karakter di dalamnya. Kesalahan bodoh tapi butuh 3 jam untuk mencari tahu.
sumber
Ini mungkin disebabkan oleh jumlah karakter maksimum yang diperbolehkan untuk kolom tertentu, seperti dalam sql satu bidang mungkin memiliki tipe data berikut
nvarchar(5)
tetapi jumlah karakter yang dimasukkan dari pengguna lebih dari yang ditentukan, maka timbul kesalahan.sumber
Saya telah menghadapi masalah yang sama beberapa hari yang lalu ketika memperbarui basis data. Dalam kasus saya, ada beberapa kolom baru yang tidak dapat dibatalkan yang ditambahkan untuk pemeliharaan yang tidak disediakan dalam kode yang menyebabkan pengecualian. Saya mencari tahu bidang-bidang itu dan memberikan nilai-nilai untuk mereka dan itu diselesaikan.
sumber
Terima kasih atas jawaban Anda, itu banyak membantu saya. seperti yang saya kode di Vb.Net, kode Bolt ini untuk Vb.Net
sumber
mungkin disebabkan oleh Properti yang tidak diisi oleh model .. melainkan itu diisi oleh Controller .. yang dapat menyebabkan kesalahan ini .. solusi untuk ini adalah menetapkan properti sebelum menerapkan validasi ModelState. dan Asumsi kedua ini adalah. Anda mungkin sudah memiliki Data di Database Anda dan mencoba memperbaruinya tetapi sekarang mengambilnya.
sumber
Dalam kasus saya, saya memiliki Path nama Kolom Tabel yang datatype saya set adalah varchar (200). Setelah memperbarui ke nvarchar (maks), saya telah menghapus tabel dari edmx dan kemudian menambahkan tabel dan wokred dengan benar untuk saya.
sumber