Преобразование типа данных 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; }