Ошибка обновления MVC: datetime2 - PullRequest
0 голосов
/ 01 февраля 2011

Немного предыстории моей проблемы - я унаследовал большое приложение C # MVC, и в настоящее время я изменяю основной процесс в приложении.

Итак, изначально пользователь загружал элемент, и это было бы так. Однако теперь пользователь может установить флажок, чтобы доставить товар. Если этот флажок установлен, таблица доставки заполняется соответствующими данными.

Вот действие POST в моем контроллере Предметов, когда пользователь первоначально загружает детали товара:

        [HttpPost]
        public ActionResult AddItemDetails(Int64? itemId, Item item, FormCollection formValues)
        {
            if (formValues["cancelButton"] != null)
            {
                return RedirectToAction("Index");
            }

            if (formValues["backButton"] != null)
            {
                return RedirectToAction("AddItemStart");
            }

            string ImageGuid = formValues["ImageGUID"];
            ViewData["Image_GUID"] = ImageGuid;

            if (item.ImageID == null && String.IsNullOrEmpty(ImageGuid))
            {
                ModelState.AddModelError("Image", "Image is required.");
                ViewData["Image"] = "Image is required.";
            }

            if (ModelState.IsValid)
            {
                item.SubmissionState = -1; // Unsubmitted;

                /**********************ADDED 25/1/2011**************************/
                item.ProductCode = formValues["ProductCode"];
                item.Name = formValues["Name"];


                string deliverySelection = formValues["deliverySelection"];

                if (deliverySelection == "on")
                {
                    item.DeliverySelection = "Yes";

                    Delivery c = new Delivery()
                    {
                        ProductCode = formValues["ProductCode"],
                        Name = formValues["Name"],
                        PhoneNo = formValues["PhoneNo"],
                        Address = formValues["Address"],
                        SubmissionDate = System.DateTime.Now
                    };

                    item.Delivery = c;
                }
                else
                {
                    item.DeliverySelection = "No";
                }

                /*****************************END*******************************/
                if (itemId.HasValue)
                {
                    UpdateItemDetails(item, ImageGuid, this);
                }
                else
                {
                    titleId = ItemServices.AddItem(item, ImageGuid);
                }

                return RedirectToAction("AddSubItemDetails", new { itemId = item.ItemID });
            }

            return View(item);
        }

Это прекрасно работает и достигает желаемого результата. Тем не менее, я немного застрял на изменении действия обновления для в контроллере элементов. Вот что у меня есть:

[HttpPost]
public ActionResult UpdateItemDetails(Int64 itemId, Item item, FormCollection formValues)
{
    if (formValues["cancelButton"] != null)
    {
        return RedirectToAction("View", new { itemId = itemId });
    }

    string image = formValues["ImageGUID"];
    ViewData["Image_GUID"] = ImageGuid;

    if (item.ImageID == null && String.IsNullOrEmpty(ImageGuid))
    {
        ModelState.AddModelError("Image", "Image is required.");
    }

    if (ModelState.IsValid)
    {
        //**********************Added 31.01.2011****************************//
     using (ModelContainer ctn = new ModelContainer())
     {
            string DeliverySelection = formValues["deliverySelection"];

            if (deliverySelection == "on")
            {
                item.DeliverySelection = "Yes";

                Delivery c = new Delivery()
            {
                ProductCode = formValues["ProductCode"],
                Name = formValues["Name"],
                PhoneNo = formValues["PhoneNo"],
                    Address = formValues["Address"],
                SubmissionDate = System.DateTime.Now
            };

                    ctn.Delierys.AddObject(c);

                item.Delivery = c;

            }
            else
            {
                item.DeliverySelection = "No";
            }


        ctn.AddToItems(item);
        ctn.SaveChanges();

        UpdateItemDetails(item, ImageGuid, this);
        return RedirectToAction("View", new { itemId = itemId });
    }

    return View("UpdateItemDetails", MasterPage, item);
}

Обратите внимание, что это немного отличается, и использует UpdateItemDetails () для обновления базы данных. Я не был уверен, что делать здесь, так как мне нужно собрать значения форм для вставки в базу данных доставки. Вот UpdateItemDetails:

 private void UpdateItemDetails(Item item, string ImageFileGuid, ItemsController controller)
    {
        using (ModelContainer ctn = new ModelContainer())
        {
            Item existingData = ItemServices.GetCurrentUserItem(item.ItemID, ctn);
            controller.UpdateModel(existingData);

            existingData.UpdatedBy = UserServices.GetCurrentUSer().UserID;
            existingData.UpdatedDate = DateTime.Now;

            // If there is a value in this field, then the user has opted to upload
            // a new cover.
            //
            if (!String.IsNullOrEmpty(ImageFileGuid))
            {
                // Create a new CoverImage object.
                //
                byte[] imageBytes = FileServices.GetBytesForFileGuid(Guid.Parse(ImageFileGuid));

                Image newImage = new Image()
                {
                    OriginalCLOB = imageBytes,
                    ThumbnailCLOB = ImageServices.CreateThumbnailFromOriginal(imageBytes),
                    HeaderCLOB = ImageServices.CreateHeaderFromOriginal(imageBytes),
                    FileName = "CoverImage"
                };

                existingData.Image = newImage;
            }

            ctn.SaveChanges();
        }
    }

Код, работающий, как указано выше, выдает следующее сообщение об ошибке при попытке обновить данные:

System.Data.SqlClient.SqlException: Преобразование данных datetime2 тип к типу данных datetime в результате в значении вне диапазона. заявление было прекращено.

Эта ошибка выдается в ctn.SaveChanges () в действии обновления.

Итак, я полагаю, что мой первый вопрос - как преодолеть эту ошибку, однако без внесения изменений, которые повлияют на действие AddItemDetails. Тогда мой второй вопрос: если эта ошибка была устранена, будет ли это правильным способом обновления?

Я был бы очень благодарен за любые указатели. Если вам нужна дополнительная информация, просто спросите.

Спасибо:)

Ответы [ 3 ]

4 голосов
/ 01 февраля 2011

Я изучил вашу ошибку и нашел этот ответ на другой вопрос, который дает немного больше информации о типах данных DATETIME и DATETIME2.

DATETIME поддерживает 1753/1/1 для "вечность" (9999/12/31), а Поддержка DATETIME2 от 0001/1/1 до вечность.

Если вы проверяете представленные данные, видите ли вы что-то аномальное? У вас есть свойство даты в вашем классе элементов, для которого задано какое-то значение по умолчанию, недопустимое для поля DATETIME?

0 голосов
/ 15 декабря 2011

У меня есть эта проблема в настоящее время, потому что если кто-то по ошибке забывает косую черту (например, 1/189, когда они имели в виду 1/1/89), TryUpdateModel () обновляет модель без ошибок, переводя ее в .NET DateTime, равный «1 / 1/0189" .

Но затем происходит сбой сохранения, когда «преобразование типа данных datetime2 в тип данных datetime привело к значению, выходящему за пределы допустимого диапазона».

Так что же я поймаю до сохранения?

0 голосов
/ 01 февраля 2011

Похоже, что одной из дат в объекте, который вы пытаетесь сохранить, является DateTime.MinValue.Это может быть дата представления, например.Проверьте данные формы, чтобы узнать, корректно ли обновляется значение клиента, и перейдите оттуда.

...