Saya memiliki kode berikut di HomeController saya:
public ActionResult Edit(int id)
{
var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
return View(ArticleToEdit);
}
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
if (!ModelState.IsValid)
return View(originalArticle);
_db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
_db.SaveChanges();
return RedirectToAction("Index");
}
Dan ini adalah tampilan untuk metode Edit:
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
Ketika saya menekan tombol kirim saya mendapatkan kesalahan: {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}
Ada ide apa masalahnya? Saya berasumsi bahwa metode edit mencoba memperbarui nilai yang diposting di DB ke yang diedit tetapi untuk beberapa alasan itu tidak menyukainya ... Meskipun saya tidak melihat mengapa tanggal terlibat karena tidak disebutkan dalam metode pengontrol untuk diedit?
asp.net-mvc
Cameron
sumber
sumber
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Jawaban:
Masalahnya adalah bahwa Anda menggunakan
ApplyPropertyChanges
dengan objek model yang hanya diisi dengan data dalam bentuk (informasi utama, cerita, dan gambar).ApplyPropertyChanges
berlaku perubahan untuk semua properti objek, termasuk Anda diinisialisasiDateTime
, yang diatur ke 0001-01-01, yang berada di luar jangkauan SQL ServerDATETIME
.Daripada menggunakan
ApplyPropertyChanges
, saya sarankan mengambil objek yang sedang dimodifikasi, mengubah bidang spesifik suntingan formulir Anda, kemudian menyimpan objek dengan modifikasi tersebut; dengan cara itu, hanya bidang yang diubah yang dimodifikasi. Bergantian, Anda dapat menempatkan input tersembunyi di halaman Anda dengan bidang lain yang terisi, tetapi itu tidak akan sangat ramah dengan pengeditan bersamaan.Memperbarui:
Berikut ini contoh yang belum diuji dari hanya memperbarui beberapa bidang objek Anda (ini dengan asumsi Anda menggunakan LINQ ke SQL):
sumber
modifiedDate
adalah nama properti Anda)story.modifiedDate = DateTime.Now;
bit ke kode saya saat ini? Terima kasihIni adalah kesalahan umum yang dihadapi orang saat menggunakan Entity Framework. Ini terjadi ketika entitas yang terkait dengan tabel yang disimpan memiliki bidang datetime wajib dan Anda tidak menyetelnya dengan beberapa nilai.
Objek datetime default dibuat dengan nilai
01/01/1000
dan akan digunakan sebagai pengganti nol. Ini akan dikirim ke kolom datetime yang dapat menyimpan nilai tanggal dari1753-01-01 00:00:00
seterusnya, tetapi tidak sebelumnya, yang mengarah ke pengecualian di luar jangkauan.Kesalahan ini dapat diatasi dengan memodifikasi bidang basis data untuk menerima nol atau dengan menginisialisasi bidang dengan nilai.
sumber
Nyonya
Jawaban: Saya kira Anda mencoba menyimpan
DateTime
dengan nilai '0001/1/1'. Cukup atur breakpoint dan debug, jika demikian gantikanDateTime
dengannull
atau atur tanggal normal.sumber
Yang ini membuatku gila. Saya ingin menghindari menggunakan waktu tanggal nullable (
DateTime?
). Saya tidak memiliki opsi untuk menggunakan tipe datetime2 SQL 2008 baik (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).Saya akhirnya memilih yang berikut:
sumber
Anda juga dapat memperbaiki masalah ini dengan menambahkan ke model (versi Entity Framework> = 5)
sumber
Jika Anda memiliki kolom yang merupakan datetime dan memungkinkan nol, Anda akan mendapatkan kesalahan ini. Saya merekomendasikan pengaturan nilai untuk meneruskan ke objek sebelum .SaveChanges ();
sumber
Saya mendapatkan kesalahan ini setelah saya mengubah model saya (kode pertama) sebagai berikut:
untuk
Baris saat ini dengan nilai nol di DateCreated menyebabkan kesalahan ini. Jadi saya harus menggunakan Pernyataan UPDATE SQL secara manual untuk menginisialisasi bidang dengan nilai standar.
Solusi lain dapat berupa penetapan nilai default untuk yang diajukan.
sumber
Dalam kasus saya, dalam initializer dari kelas yang saya gunakan di tabel database, saya tidak menetapkan nilai default apa pun untuk properti DateTime saya, karena itu mengakibatkan masalah yang dijelaskan dalam jawaban @Andrew Orsich. Jadi saya baru saja membuat properti menjadi nullable. Atau saya juga bisa memberikannya DateTime. Sekarang di konstruktor. Semoga ini bisa membantu seseorang.
sumber
Sepertinya Anda menggunakan kerangka entitas. Solusi saya adalah mengganti semua kolom datetime ke datetime2, dan menggunakan datetime2 untuk kolom baru apa pun, dengan kata lain membuat EF menggunakan datetime2 secara default. Tambahkan ini ke metode OnModelCreating pada konteks Anda:
Itu akan mendapatkan semua DateTime dan DateTime? properti pada semua entitas dalam model Anda.
sumber
Saya memiliki masalah yang sama, sayangnya, saya memiliki dua properti DateTime pada model saya dan satu properti DateTime adalah nol sebelum saya melakukan SaveChanges.
Jadi pastikan model Anda memiliki nilai DateTime sebelum menyimpan perubahan atau membuatnya nullable untuk mencegah kesalahan:
Jadi ini memecahkan masalah saya, ini masalah memastikan tanggal model Anda sudah benar sebelum bertahan ke database:
sumber
Jika Anda menggunakan versi Entity Framework> = 5 lalu menerapkan [DatabaseGenerated (DatabaseGeneratedOption.Computed)] anotasi ke properti DateTime Anda di kelas Anda akan memungkinkan pemicu tabel database untuk melakukan tugasnya memasukkan tanggal untuk pembuatan catatan dan memperbarui catatan tanpa menyebabkan kode Kerangka Entitas Anda untuk muntah.
Ini mirip dengan jawaban ke-6, yang ditulis oleh Dongolo Jeno dan Diedit oleh Gille Q.
sumber
Juga, jika Anda tidak tahu bagian dari kode di mana kesalahan terjadi, Anda dapat memprofilkan eksekusi "buruk" sql menggunakan sql profiler yang diintegrasikan ke mssql.
Param datetime yang buruk akan menampilkan sesuatu seperti itu:
sumber
Masalah ini biasanya terjadi ketika Anda mencoba memperbarui entitas. Misalnya Anda memiliki suatu entitas yang berisi bidang yang disebut
DateCreated
yang [Diperlukan] dan ketika Anda memasukkan record, tidak ada kesalahan dikembalikan tetapi ketika Anda ingin Perbarui bahwa entitas tertentu, Anda mendapatkanSekarang ini solusinya:
Pada tampilan edit Anda, yaitu
edit.cshtml
untuk pengguna MVC semua yang perlu Anda lakukan adalah menambahkan bidang formulir tersembunyi untuk AndaDateCreated
tepat di bawah bidang tersembunyi untuk kunci utama dari data edit.Contoh:
Menambahkan ini ke tampilan edit Anda, Anda tidak akan pernah memiliki kesalahan itu saya jamin.
sumber
Anda harus mengaktifkan nilai nol untuk variabel tanggal Anda:
sumber
Coba buat properti Anda nullable.
Bekerja untukku.
sumber
Jika Anda memiliki akses ke DB, Anda dapat mengubah jenis kolom DB dari datetime ke datetime2 (7) itu masih akan mengirim objek datetime dan itu akan disimpan
sumber
Model harus memiliki datetime nullable. Metode yang disarankan sebelumnya untuk mengambil objek yang harus dimodifikasi harus digunakan sebagai pengganti ApplyPropertyChanges. Dalam kasus saya, saya memiliki metode ini untuk Menyimpan objek saya:
Dan kemudian dalam layanan, saya mengambil menggunakan:
Kode layanan lengkap adalah sebagai berikut:
sumber
[Diselesaikan] Dalam Kode Entitas Kerangka Pertama (kasus saya) baru saja berubah
DateTime
untukDateTime?
menyelesaikan masalah saya.sumber
Kesalahan: Konversi tipe data datetime2 ke tipe data datetime menghasilkan nilai di luar kisaran.
Kesalahan ini terjadi ketika karena TIDAK menetapkan nilai apa pun terhadap kolom tanggal TIDAK NULL dalam SQL DB menggunakan EF dan diselesaikan dengan menetapkan yang sama.
Semoga ini membantu!
sumber
Mendapat masalah ini ketika membuat kelas saya dari pendekatan Database First. Dipecahkan dengan hanya menggunakan Convert.DateTime (dateCausingProblem) Bahkan, selalu mencoba untuk mengkonversi nilai sebelum melewati, Ini menyelamatkan Anda dari nilai yang tidak terduga.
sumber
Anda harus mencocokkan format input bidang tanggal Anda dengan format entitas yang diperlukan yaitu yyyy / mm / dd
sumber