C# MVC更新错误:datetime2

C# MVC更新错误:datetime2,c#,asp.net-mvc-2,entity-framework-4,linq-to-entities,C#,Asp.net Mvc 2,Entity Framework 4,Linq To Entities,我的问题有一点背景知识——我继承了一个大型MVC应用程序,目前正在对该应用程序中的主进程进行更改 最初,用户会上传一个项目,就是这样。但是,现在用户可以选择一个复选框来交付项目。如果选中此复选框,则传递表将填充相关详细信息 以下是用户最初上载项目详细信息时“我的项目”控制器中的POST操作: [HttpPost] public ActionResult AddItemDetails(Int64? itemId, Item item, FormCollection

我的问题有一点背景知识——我继承了一个大型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);
        }
这样做效果很好,达到了预期的效果。但是,我在修改Items控制器中的更新操作时有点卡住了。以下是我到目前为止的情况:

[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更新数据库略有不同。我不确定该在这里做什么,因为我确实需要收集FormValue以插入到传递数据库中。以下是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操作的更改。我的第二个问题是,如果这个错误被清除,这是一个正确的更新方式吗

如果有人给我指点,我将不胜感激。如果需要更多的信息,请询问


谢谢:

您试图保存的对象中的一个日期似乎是DateTime.MinValue。例如,它可能是提交日期。检查表单数据,查看是否正确更新了客户机的值,然后从那里开始操作。

您试图保存的对象中的一个日期似乎是DateTime.MinValue。例如,它可能是提交日期。检查您的表单数据,查看是否正确更新了客户端的值,然后继续执行。

我在查看您的错误时发现了另一个问题,该问题提供了有关DATETIME和DATETIME2数据类型的更多信息

DATETIME支持1753/1/1到 永恒9999/12/31,而 DATETIME2支持0001/1/1至 永恒


如果您检查正在提交的数据,是否发现任何异常情况?您的item类中是否有一个日期属性被设置为对DATETIME字段无效的默认值?

我在查看您的错误时发现了另一个问题,该问题提供了有关DATETIME和DATETIME2数据类型的更多信息

DATETIME支持1753/1/1到 永恒9999/12/31,而 DATETIME2支持0001/1/1至 永恒


如果您检查正在提交的数据,是否发现任何异常情况?您的item类中是否有一个date属性被设置为对DATETIME字段无效的默认值?

我目前有这个问题,因为如果有人错误地忘记了斜杠,例如1/189,而他们的意思是1/1/89,TryUpdateModel会无误地更新模型,将其转换为.NET DATETIME 1/1/0189

但是,由于将datetime2数据类型转换为datetime数据类型,存储崩溃,导致值超出范围


那么,哇,我在保存之前就发现了这个问题吗?

我现在有这个问题,因为如果有人错误地忘记了斜杠,例如1/189,当他们的意思是1/1/89时,TryUpdateModel会无误地更新模型,将其转换为.NET DateTime 1/1/0189

但是,由于将datetime2数据类型转换为datetime数据类型,存储崩溃,导致值超出范围


哇,我在保存之前看到了吗?

上面链接的帖子说,检查日期的年份-如果是1753年之前,你需要将其更改为1753年之后的某个日期,但这是认真的吗?TryUpdateModel的全部意义在于,您不必对每个字段进行硬编码验证检查。必须有更好的方法。上面链接的帖子说,检查日期的年份——如果是1753年之前,你需要将它改为1753年之后的年份,但认真地说?TryUpdateModel的全部意义在于,您不必对每个字段进行硬编码验证检查。一定有更好的办法。