0

我有以下课程

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 无法跟踪具有相同键的多个对象。

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

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

帮助表示赞赏。

谢谢你。

4

1 回答 1

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

于 2012-08-14T20:20:04.110 回答