Mam następujący kod w moim HomeController:
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");
}
A oto widok dla metody 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>
<% } %>
Po naciśnięciu przycisku przesyłania {"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."}
pojawia się błąd: Jakieś pomysły na czym polega problem? Zakładam, że metoda edycji próbuje zaktualizować wartość opublikowaną w bazie danych do edytowanej w dniu, ale z jakiegoś powodu jej się to nie podoba ... Chociaż nie rozumiem, dlaczego chodzi o datę, ponieważ nie jest wspomniana w metoda kontrolera do edycji?
asp.net-mvc
Cameron
źródło
źródło
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Odpowiedzi:
Problem polega na tym, że używasz
ApplyPropertyChanges
z obiektem modelu, który został wypełniony tylko danymi w formularzu (nagłówek, artykuł i obraz).ApplyPropertyChanges
stosuje zmiany do wszystkich właściwości obiektu, w tym niezainicjowanego obiektuDateTime
, który jest ustawiony na 0001-01-01, który jest poza zakresem SQL ServerDATETIME
.Zamiast używać
ApplyPropertyChanges
, sugerowałbym pobranie modyfikowanego obiektu, zmianę określonych pól edytowanych przez formularz, a następnie zapisanie obiektu z tymi modyfikacjami; w ten sposób modyfikowane są tylko zmienione pola. Alternatywnie możesz umieścić ukryte dane wejściowe na swojej stronie z wypełnionymi innymi polami, ale nie byłoby to zbyt przyjazne przy jednoczesnych edycjach.Aktualizacja:
Oto nieprzetestowany przykład aktualizacji niektórych pól obiektu (przy założeniu, że używasz LINQ to SQL):
źródło
modifiedDate
tak nazywa się Twoja nieruchomość)story.modifiedDate = DateTime.Now;
bit do mojego obecnego kodu? DziękiJest to typowy błąd, z którym spotykają się ludzie podczas korzystania z Entity Framework. Dzieje się tak, gdy encja skojarzona z zapisywaną tabelą ma obowiązkowe pole daty i godziny i nie ustawisz dla niego jakiejś wartości.
Domyślny obiekt datetime jest tworzony z wartością
01/01/1000
i będzie używany zamiast null. Zostanie to przesłane do kolumny datetime, w której mogą znajdować się wartości dat1753-01-01 00:00:00
począwszy od , ale nie wcześniej, co prowadzi do wyjątku poza zakresem.Ten błąd można rozwiązać, modyfikując pole bazy danych, aby akceptowało wartość null, lub inicjując pole wartością.
źródło
Msdn
Odpowiedź: Przypuszczam, że próbujesz zapisać
DateTime
z wartością „0001/1/1”. Wystarczy ustawić punkt przerwania i debugowania to, jeśli tak to wymienićDateTime
znull
lub zestaw normalny termin.źródło
Ten doprowadzał mnie do szału. Chciałem uniknąć używania daty i godziny zerowej (
DateTime?
). Nie miałem również możliwości użycia typu datetime2 SQL 2008 (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).Ostatecznie zdecydowałem się na:
źródło
Możesz również rozwiązać ten problem, dodając do modelu (wersja Entity Framework> = 5)
źródło
Jeśli masz kolumnę z datą i godziną i dopuszcza wartość null, zostanie wyświetlony ten błąd. Zalecam ustawienie wartości do przekazania do obiektu przed .SaveChanges ();
źródło
Otrzymałem ten błąd po zmianie modelu (najpierw kod) w następujący sposób:
do
Obecne wiersze z wartością null w DateCreated spowodowały ten błąd. Musiałem więc ręcznie użyć instrukcji SQL UPDATE do inicjalizacji pola ze standardową wartością.
Innym rozwiązaniem mogłoby być określenie domyślnej wartości pola.
źródło
W moim przypadku w inicjatorze z klasy, której używałem w tabeli bazy danych, nie ustawiałem żadnej wartości domyślnej na moją właściwość DateTime, co spowodowało problem wyjaśniony w odpowiedzi @Andrew Orsich. Dlatego właśnie ustawiłem właściwość na wartość null. Mogłem też podać mu DateTime.Now w konstruktorze. Mam nadzieję, że to komuś pomoże.
źródło
Wygląda na to, że używasz struktury encji. Moje rozwiązanie polegało na przełączeniu wszystkich kolumn z datą i godziną na datetime2 i użyciu datetime2 dla wszystkich nowych kolumn, innymi słowy, aby EF domyślnie używał datetime2. Dodaj to do metody OnModelCreating w swoim kontekście:
To dostanie wszystkie DateTime i DateTime? właściwości wszystkich elementów w modelu.
źródło
Miałem ten sam problem, niestety mam dwie właściwości DateTime w moim modelu i jedna właściwość DateTime ma wartość null, zanim wykonam SaveChanges.
Dlatego upewnij się, że model ma wartość DateTime przed zapisaniem zmian lub ustaw wartość null, aby zapobiec błędom:
Więc to rozwiązuje mój problem, jest to kwestia upewnienia się, że data twojego modelu jest poprawna przed utrwaleniem w bazie danych:
źródło
Jeśli używasz Entity Framework w wersji> = 5, zastosowanie adnotacji [DatabaseGenerated (DatabaseGeneratedOption.Computed)] do właściwości DateTime klasy umożliwi wyzwalaczowi tabeli bazy danych wykonywanie zadania polegającego na wprowadzaniu dat tworzenia rekordów i aktualizowaniu rekordów bez powodowania Twój kod Entity Framework do gagowania.
Jest to podobne do odpowiedzi szóstej, napisanej przez Dongolo Jeno i zredagowanej przez Gille Q.
źródło
Ponadto, jeśli nie znasz części kodu, w której wystąpił błąd, możesz profilować „złe” wykonanie sql za pomocą profilera sql zintegrowanego z mssql.
Zły parametr daty i godziny wyświetli coś takiego:
źródło
Ten problem zwykle występuje, gdy próbujesz zaktualizować jednostkę. Na przykład masz podmiot, który zawiera pole o nazwie
DateCreated
, która jest [Wymagane] i po wstawieniu rekordu, nie jest zwracany błąd ale gdy chcesz zaktualizować ten konkretny podmiot, Ci uzyskaćOto rozwiązanie:
W widoku edycji, tj.
edit.cshtml
Dla użytkowników MVC, wszystko, co musisz zrobić, to dodać ukryte pole formularzaDateCreated
tuż poniżej ukrytego pola dla klucza podstawowego danych edycji.Przykład:
Dodając to do widoku edycji, nigdy nie będziesz mieć tego błędu, zapewniam cię.
źródło
Musisz włączyć wartość null dla swojej zmiennej daty:
źródło
Spróbuj ustawić wartość null dla swojej właściwości.
Pracował dla mnie.
źródło
Jeśli masz dostęp do bazy danych, możesz zmienić typ kolumny bazy danych z datetime na datetime2 (7), to nadal wyśle obiekt datetime i zostanie on zapisany
źródło
Model powinien mieć datęetime dopuszczającą wartość null. Zamiast metody ApplyPropertyChanges należy użyć wcześniej sugerowanej metody pobierania obiektu, który ma zostać zmodyfikowany. W moim przypadku miałem tę metodę, aby zapisać mój obiekt:
A potem w serwisie pobieram za pomocą:
Pełny kod usługi jest następujący:
źródło
[Rozwiązany] W Entity Framework Code First (mój przypadek) po prostu zmienia się,
DateTime
abyDateTime?
rozwiązać mój problem.źródło
Błąd: konwersja typu danych datetime2 na typ danych datetime spowodowała wystąpienie wartości spoza zakresu.
Ten błąd wystąpił, gdy z powodu NIE przypisano żadnej wartości w kolumnie daty NOT NULL w bazie danych SQL przy użyciu EF i został rozwiązany przez przypisanie tego samego.
Mam nadzieję że to pomoże!
źródło
Mam ten problem podczas tworzenia moich klas z podejścia Database First. Rozwiązany przy użyciu prostego Convert.DateTime (dateCausingProblem) W rzeczywistości zawsze staraj się konwertować wartości przed przekazaniem, oszczędza to przed nieoczekiwanymi wartościami.
źródło
musisz dopasować format wejściowy swojego pola daty do wymaganego formatu jednostki, czyli rrrr / mm / dd
źródło