У меня есть следующий код в моем 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");
}
И это представление для метода 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>
<% } %>
Когда я нажимаю кнопку отправки, я получаю сообщение об ошибке: есть {"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."}
идеи, в чем проблема? Я предполагаю, что метод edit пытается обновить опубликованное значение в БД до отредактированного, но по какой-то причине это не нравится ... Хотя я не понимаю, почему используется дата, так как она не упоминается в метод контроллера для редактирования?
asp.net-mvc
Cameron
источник
источник
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Ответы:
Проблема заключается в том, что вы используете
ApplyPropertyChanges
объект модели, который был заполнен только данными в форме (заголовок, история и изображение).ApplyPropertyChanges
применяет изменения ко всем свойствам объекта, включая неинициализированноеDateTime
свойство, для которого установлено значение 0001-01-01, которое находится за пределами диапазона SQL ServerDATETIME
.Вместо использования
ApplyPropertyChanges
я бы предложил получить изменяемый объект, изменить определенные поля, которые редактирует ваша форма, а затем сохранить объект с этими изменениями; Таким образом, изменяются только измененные поля. Кроме того, вы можете размещать скрытые входы на своей странице с другими заполненными полями, но это не очень подходит для одновременного редактирования.Обновить:
Вот непроверенный пример простого обновления некоторых полей вашего объекта (предполагается, что вы используете LINQ to SQL):
источник
modifiedDate
это название вашей собственности)story.modifiedDate = DateTime.Now;
бит в мой текущий код? СпасибоЭто распространенная ошибка, с которой люди сталкиваются при использовании Entity Framework. Это происходит, когда объект, связанный с сохраняемой таблицей, имеет обязательное поле даты и времени, и вы не устанавливаете его с некоторым значением.
Объект datetime по умолчанию создается со значением
01/01/1000
и будет использоваться вместо нуля. Это будет отправлено в столбец datetime, который может содержать значения даты и1753-01-01 00:00:00
далее, но не раньше, что приведет к исключению за пределами допустимого диапазона.Эту ошибку можно устранить, изменив поле базы данных так, чтобы оно принимало значение NULL, или инициализировав поле значением.
источник
MSDN
Ответ: Я полагаю, вы пытаетесь сохранить
DateTime
со значением «0001/1/1». Просто набор точек останова и отлаживать его, если да , то заменитьDateTime
сnull
или набор нормальной датой.источник
Этот сводил меня с ума. Я хотел избежать использования обнуляемой даты (
DateTime?
). У меня также не было возможности использовать тип datetime2 в SQL 2008 (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).В конце концов я выбрал следующее:
источник
Вы также можете решить эту проблему, добавив в модель (версия Entity Framework> = 5)
источник
Если у вас есть столбец с датой и разрешением null, вы получите эту ошибку. Я рекомендую установить значение для передачи объекту до .SaveChanges ();
источник
Я получил эту ошибку после того, как изменил свою модель (сначала код) следующим образом:
в
Присутствующие строки с нулевым значением в DateCreated вызвали эту ошибку. Поэтому мне пришлось использовать SQL UPDATE Statement вручную для инициализации поля стандартным значением.
Другим решением может быть указание значения по умолчанию для поля.
источник
В моем случае в инициализаторе класса, который я использовал в таблице базы данных, я не устанавливал никакого значения по умолчанию для своего свойства DateTime, поэтому возникла проблема, объясненная в ответе @Andrew Orsich. Так что я просто сделал собственность обнуляемой. Или я мог бы также дать ему DateTime.Now в конструкторе. Надеюсь, это кому-нибудь поможет.
источник
Похоже, что вы используете структуру лица. Мое решение состояло в том, чтобы переключить все столбцы datetime на datetime2 и использовать datetime2 для любых новых столбцов, другими словами, заставить EF использовать datetime2 по умолчанию. Добавьте это к методу OnModelCreating в вашем контексте:
Что получит все DateTime и DateTime? свойства на всех сущностях в вашей модели.
источник
У меня была та же проблема, к сожалению, у меня есть два свойства DateTime в моей модели, и одно свойство DateTime является нулевым, прежде чем я сделаю SaveChanges.
Поэтому убедитесь, что ваша модель имеет значение DateTime, прежде чем сохранять изменения, или сделайте его обнуляемым, чтобы избежать ошибки:
Таким образом, это решает мою проблему, поэтому необходимо убедиться, что дата вашей модели верна перед сохранением в базе данных:
источник
Если вы используете Entity Framework версии> = 5, то применение аннотации [DatabaseGenerated (DatabaseGeneratedOption.Computed)] к вашим свойствам DateTime вашего класса позволит триггеру таблицы базы данных выполнять свою работу по вводу дат для создания записи и обновления записи, не вызывая Ваш код Entity Framework, чтобы заткнуть рот.
Это похоже на 6-й ответ, написанный Донголо Джено и отредактированный Гилле В.
источник
Кроме того, если вы не знаете часть кода, где произошла ошибка, вы можете профилировать «плохое» выполнение SQL Server, используя SQL Server Profiler, интегрированный в MSSQL.
Плохой параметр datetime будет отображать что-то вроде этого:
источник
Эта проблема обычно возникает, когда вы пытаетесь обновить сущность. Например у вас есть объект , который содержит поле с именем ,
DateCreated
которое [необходимо] и при вставке записи, не возвращается никакой ошибки , но если вы хотите обновить этот конкретный объект, Вам получитьТеперь вот решение:
В представлении редактирования, т.
edit.cshtml
Е. Для пользователей MVC, все, что вам нужно сделать, это добавить скрытое поле формы для вашегоDateCreated
чуть ниже скрытого поля для первичного ключа данных редактирования.Пример:
Добавив это к вашему редактируемому виду, у вас никогда не будет этой ошибки, я вас уверяю.
источник
Вы должны включить нулевое значение для вашей переменной даты:
источник
Попробуйте сделать вашу собственность обнуляемой.
Работал на меня.
источник
Если у вас есть доступ к БД, вы можете изменить тип столбца БД с datetime на datetime2 (7), он все равно отправит объект datetime, и он будет сохранен
источник
Модель должна иметь значение даты и времени, обнуляемое. Предложенный ранее метод получения объекта, который необходимо изменить, следует использовать вместо ApplyPropertyChanges. В моем случае у меня был этот метод для сохранения моего объекта:
И затем в сервисе, я получаю с помощью:
Полный код обслуживания приведен ниже:
источник
[Решено] В Entity Framework Code First (мой случай) просто меняется,
DateTime
чтобыDateTime?
решить мою проблему.источник
Ошибка: преобразование типа данных datetime2 в тип данных datetime привело к значению вне допустимого диапазона.
Эта ошибка произошла, когда из-за НЕ назначено какое-либо значение столбцу даты NOT NULL в БД SQL с помощью EF, и была устранена путем присвоения того же значения.
Надеюсь это поможет!
источник
Получил эту проблему, когда создал мои классы из подхода Database First. Решено с помощью простого Convert.DateTime (dateCausingProblem) На самом деле, всегда пытайтесь преобразовать значения перед передачей, это спасает вас от неожиданных значений.
источник
Вы должны сопоставить формат ввода вашего поля даты с требуемым форматом объекта, который является гггг / мм / дд
источник