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

DB から読み込んで、コンテキストに関連付けられた前の日付の記事を取得します。newsオブジェクトの状態を に設定することによりModified、同じキーを持つ 2 番目のオブジェクトをコンテキストにアタッチしますが、これは禁止されており、例外が発生します。

次のいずれかを使用できます。

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

これにより、オブジェクト全体ではなく DB から日付のみが読み込まれるため、DB からのエンティティはコンテキストに関連付けられません。

または、次を使用できます。

[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 に答える