【问题标题】:DateTime Error When Saving Changes to DB将更改保存到数据库时出现日期时间错误
【发布时间】:2012-08-14 20:02:17
【问题描述】:

我有以下课程

public class News
{
    [Key]
    public int NewsId { get; set; }

    [Required(ErrorMessage = "The article title is required.")]
    [MaxLength(50)]
    public string Title { get; set; }

    [Required(ErrorMessage = "The article text is required.")]
    [UIHint("MultilineText")]
    [MaxLength(500)]
    public string Article { get; set; }

    [Display(Name = "Days to Expire")]
    public int DaysToExpire { get; set; }

    public DateTime ArticleDate { get; set; }
}

以及生成的 CRUD 视图页面。这是控制器中用于编辑的代码:

    [HttpPost]
    public ActionResult Edit(News news)
    {
        if (ModelState.IsValid)
        {
            db.Entry(news).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(news);
    }

当我尝试编辑记录时,我收到以下错误:

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。

我把方法改成

[HttpPost]
    public ActionResult Edit(News news)
    {
        if (ModelState.IsValid)
        {
            var prevDate = db.NewsArticles.First(a => a.NewsId == news.NewsId).ArticleDate;

            news.ArticleDate = prevDate;

            db.Entry(news).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(news);
    }

尝试将 ArticleDate 属性设置为原来的值,但收到以下错误

语句已终止。

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象。

我发现这个question 是同样的错误(有趣的是,他们也在处理文章)并且它提到错误是由于使用了 ApplyPropertyChanges。

要添加,在 Edit.cshtml 中,ArticleDate 不作为可编辑字段存在。

感谢您的帮助。

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 linq entity-framework-4


    【解决方案1】:

    通过从数据库中加载,您可以将具有上一个日期的文章附加到上下文中。通过将news 对象的状态设置为Modified,您将具有相同键的第二个对象附加到上下文中,这是被禁止的并导致异常。

    您可以使用:

    var prevDate = db.NewsArticles
        .Where(a => a.NewsId == news.NewsId)
        .Select(a => a.ArticleDate)
        .First();
    

    这只会加载数据库中的日期,而不是整个对象,因此数据库中的任何实体都不会附加到上下文中。

    或者你可以使用:

    [HttpPost]
    public ActionResult Edit(News news)
    {
        if (ModelState.IsValid)
        {
            var prevNews = db.NewsArticles.First(a => a.NewsId == news.NewsId);
    
            news.ArticleDate = prevNews.ArticleDate;
    
            db.Entry(prevNews).CurrentValues.SetValues(news);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(news);
    }
    

    编辑

    有关您的第一个异常的解释,请查看此问题及其答案:Using DateTime properties in Code-First Entity Framework and SQL Server

    【讨论】:

    • 非常感谢。如此简单的修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2017-03-25
    • 2019-04-02
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多