1

と という名前のテーブルに 2 つの列がCreatedOnありModifiedOnます。もちろん、フォームでは、非表示のフィールドのように、これらの 2 つのフィールドを表示したくありません。同じフォームを投稿するときにModifiedOn、現在の DateTime で変更し、CreatedOn値をそのまま保持したい。ただし、非表示のファイル名 CreatedOn がないため、データベースで null に設定されます。それで、私は以下のコードを使用しました

public ActionResult Edit(User user)
{ 
            if (ModelState.IsValid)
            {

                var OldInsObj = db.Users.Find(user.UserId);
                DateTime UsersDateCreated = (DateTime)db.Entry(OldInsObj).Property("UsersDateCreated").CurrentValue;

                user.UsersDateCreated = UsersDateCreated;

                user.UsersDateModified = DateTime.Now;

                db.Entry(user).State = EntityState.Modified;

                db.SaveChanges();
                return RedirectToAction("Index");
                }
}

このエラーが発生しています

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

どうすればこれを解決できますか?

読むためのブログリンクを提供しないでください。私はすでにそれらのいくつかを読みましたが、できませんでした.

ありがとうございました。

4

1 に答える 1

3

この問題を解決するには、いくつかの方法があります。新しいインスタンスをアタッチする前に、古いオブジェクトをデタッチできます

public ActionResult Edit(User user)
{ 
        if (ModelState.IsValid)
        {
            var OldInsObj = db.Users.Find(user.UserId);
            DateTime UsersDateCreated = OldInsObj.UsersDateCreated;

            user.UsersDateCreated = UsersDateCreated;
            user.UsersDateModified = DateTime.Now;

            db.Entry(OldInsObj).State = EntityState.Detached;

            db.Entry(user).State = EntityState.Modified;

            db.SaveChanges();
            return RedirectToAction("Index");
        }
 }

データベースから取得したエンティティ インスタンスを更新できます。

public ActionResult Edit(int userId)
{ 
        var user = db.Users.Find(userId);

        if (TryUpdateModel(user))
        {                
            user.UsersDateCreated = UsersDateCreated;

            user.UsersDateModified = DateTime.Now;

            db.SaveChanges();
            return RedirectToAction("Index");
        }
 }

または、Automapper を使用userしてインスタンスの値をインスタンスにコピーすることもできOldInsObjます。

public ActionResult Edit(User user)
{ 
        if (ModelState.IsValid)
        {
            var OldInsObj = db.Users.Find(user.UserId);
            DateTime UsersDateCreated = OldInsObj.UsersDateCreated;

            OldInsObj = Mapper.Map(user);

            OldInsObj.UsersDateCreated = UsersDateCreated;
            OldInsObj.UsersDateModified = DateTime.Now;

            db.SaveChanges();
            return RedirectToAction("Index");
        }
 }
于 2012-07-16T08:24:18.550 に答える