Преобразование типа данных datetime2 в тип данных типа datetime Ошибка
У меня есть контроллер:
[HttpPost]
public ActionResult Create(Auction auction)
{
var db = new EbuyDataContext();
db.Auctions.Add(auction);
db.SaveChanges();
return View(auction);
}
Модель:
public class Auction
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public decimal StartPrice { get; set; }
public decimal CurrentPrice { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }}
}
И представление:
@model Ebuy.Website.Models.Auction
@using (Html.BeginForm())
{
<p>
//All the information fields...
@Html.LabelFor(model => model.EndTime)
@Html.EditorFor(model => model.EndTime)
</p>
}
Когда я пытаюсь запустить его, я получаю сообщение об ошибке:
Преобразование типа данных datetime2 в тип данных datetime приводило к внеуровневому значению.
Модель-контроллер-вид из книги, скопированной один к одному.
Каков формат, который мне нужно ввести в поле EndTime
, чтобы у меня не было этой ошибки?
Ответы
Ответ 1
Ошибка связана с тем, что вы фактически не установили эти значения правильно, убедитесь, что вы их устанавливаете в зависимости от локали вашего приложения. (например, dd/mm/yyyy для en-GB
, мм/дд/гггг для en-US
).
Также похоже, что ваша база данных настроена для использования столбца datetime2
и столбца не a datetime
.
Вы можете:
A) Измените базу данных, чтобы изменить тип от datetime2
до datetime
B) Измените типы в Модели на datetime2
, выполнив:
[Column(TypeName = "DateTime2")]
public DateTime StartTime { get; set; }
[Column(TypeName = "DateTime2")]
public DateTime EndTime { get; set; }
Ответ 2
У меня была такая же проблема, когда я попытался сохранить нерассмотренный член DateTime в БД, используя EntityFramework.
Я прочитал ответы здесь, и я узнал, что это можно решить, объявив член как обнуляемый. Я попробовал, и это сработало!
Итак, вот кодовая привязка для тех, кто в ней нуждается:
public Nullable<DateTime> MyDateTime { get; set; }
или
public DateTime? MyDateTime { get; set; }
Позже я мог бы использовать его, как ниже:
if(MyDateTime.HasValue)
{
DoBlaBla(MyDateTime.Value);
}
или просто присвойте ему значение, как ничего не случилось...
MyDateTime = DateTime.Now;
Ответ 3
Учитываются ли ваши столбцы с типом datetime2 с нулевыми значениями. Если нет, вы можете получить эту ошибку, если не назначаете значение этим столбцам.
По умолчанию CodeFirst будет создавать столбцы с нулевым значением, если ваша модель не использует свойства с нулевым значением. Попробуйте преобразовать эти свойства в nullable datetime.
Ответ 4
Я также ударил эту проблему.
Преобразование типа данных datetime2 в тип данных datetime приводит к внеуровневому значению - это очень невыгодная ошибка, которую вы получаете.
Чтобы решить проблему, я должен был выполнить следующее (используя приведенный выше пример):
Консоль диспетчера пакетов можно найти в → Инструменты → Диспетчер пакетов библиотек → Консоль диспетчера пакетов
Я включил Миграции базы данных в консоли диспетчера пакетов → Включить-Миграции
Затем добавлен следующий код в классе контроллера:
public class Auction
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public decimal StartPrice { get; set; }
public decimal CurrentPrice { get; set; }
// My Edit to the code Start -->
public Nullable<DateTime> StartTime { get; set; }
public Nullable<DateTime> EndTime { get; set; }}
// My Edit to the code Finish <--
}
Затем в классе моделей:
[HttpPost]
// My Edit to the code Start -->
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode=true, DataFormatString = "{0:d}")]]
// My Edit to the code Finish <--
public ActionResult Create(Auction auction)
{
// My Edit to the code Start -->
if(ModelState.IsValid)
{
// Only Apply the DateTime if the Action is Valid...
auction.StartTime = DateTime.Now;
}
// My Edit to the code Finish <--
var db = new EbuyDataContext();
db.Auctions.Add(auction);
db.SaveChanges();
return View(auction);
}
Затем добавьте в базу данных изменения в консоли диспетчера пакетов → Add-Migration (ваше изменение идет здесь)
Затем запустите обновление базы данных в консоли диспетчера пакетов → Обновить базу данных
Важно отметить, что данные, указанные в базе данных, верны в приведенной выше реализации:
E.G: 17/06/2013 12:00:00 AM
Эта ошибка является невероятно глупой ошибкой, но, похоже, она застала многих людей, включая мое. Теперь я знаю, почему эта ошибка возникает, кажется, что ее легко исправить и обойти, но почему такая распространенная проблема не будет исправлена в последней версии MVC, это выходит за рамки моего понимания.
Ответ 5
У меня возникла аналогичная ошибка, когда я пытался добавить change_date в контактную сущность на уровне сервиса. Проблема была решена путем добавления параметра из контроллера. Попробуйте добавить параметр из контроллера.
Ответ 6
У меня было значение getdate() по умолчанию для DateCreated в БД. Я не устанавливал значение в EF, потому что не думал, что мне нужно. Как только я передал значение через EF на вставке, ошибка исчезла. Почему эта ошибка в первую очередь? Я так и не понял.
Ответ 7
Я рекомендую присвоить свойство DateTime значение NULL, а также использовать проверку атрибута, чтобы убедиться, что значение находится в допустимом диапазоне.
Я создал собственный атрибут, унаследованный от RangeAttribute, для проверки значения даты.
public class DbDateRangeAttribute
: RangeAttribute
{
public DbDateRangeAttribute()
: base(typeof(DateTime), SqlDateTime.MinValue.Value.ToShortDateString(), SqlDateTime.MaxValue.Value.ToShortDateString())
{ }
}
И затем вы используете такой атрибут
[DbDateRange]
public DateTime? StartTime { get; set; }
Таким образом, если пользователь вводит значение вне диапазона SqlDateTime (вероятно, из-за проблемы выбора даты на стороне клиента), он получит осмысленное сообщение об ошибке следующего вида:
Поле StartTime должно быть между 1/1/1753 12:00:00 и 12/31/9999 12:00:00 AM.
Ответ 8
Я столкнулся с этим с моими системными полями (created_on, modified_on), хотя моя модель была правильно определена.
Причиной моей проблемы было использование отключенного атрибута vs readonly. Формы не будут передавать заблокированные входные значения контроллеру, что привело к нулевому значению, которое, в свою очередь, привело к минимальному значению даты/времени.
Неверно:
<div class="form-group">
@Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" })
<div class="col-lg-9">
@Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", disabled="disabled" } })
@Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" })
</div>
</div>
Справа:
<div class="form-group">
@Html.LabelFor(model => model.CreatedOn, htmlAttributes: new { @class = "control-label col-lg-3" })
<div class="col-lg-9">
@Html.EditorFor(model => model.CreatedOn, new { htmlAttributes = new { @class = "form-control", @readonly="readonly" } })
@Html.ValidationMessageFor(model => model.CreatedOn, "", new { @class = "text-danger" })
</div>
</div>
Ответ 9
Этот пост - Решение для: "Преобразование типа данных datetime2 в тип данных даты и времени приводило к значению вне диапазона" с Entity Framework при вызове SaveChanges - предлагает использовать атрибут. Это решило проблему для меня.
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public Nullable<System.DateTime> Created { get; set; }