2

したがって、行の編集ページで主キーフィールドを編集できるようにする必要があります。エラーが発生します。

ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。エンティティがロードされてから、エンティティが変更または削除された可能性があります。ObjectStateManagerエントリを更新します。

主キーフィールドを変更しない場合、他のすべての変更をデータベースに保存できます。

これが私の編集機能です。

//edit - post
[HttpPost]
public ActionResult ActiveCampaignsEdit(ActiveCampaign activecampaign)
{
  try
  {
    if (ModelState.IsValid)
    {
      db.Entry(activecampaign).State = EntityState.Modified;
      db.SaveChanges();
      return RedirectToAction("ActiveCampaigns");
    }
  }
  catch (DataException err)
  {
    //Log the error (add a variable name after DataException)
    ModelState.AddModelError(string.Empty, err.Message);
  }
  ViewBag.TypesList = new SelectList(db.Types, "TypeId", "TypeName");
  ViewBag.CaptureFormsList = new SelectList(db.CaptureForms, "Id", "Name");
  ViewBag.AssignedUsersList = new SelectList(db.Users, "Id", "Username");
  return View(activecampaign);
}

主キーを編集するにはどうすればよいですか、それとも間違った方法でこれにアプローチしていますか?

4

2 に答える 2

3

Entity Framework のような ORM を使用する場合、UPDATE コマンドは基本的に次のように構成されます。

UPDATE table 
SET ChangedCol = ChangedVal 
WHERE PrimaryKeyCol = PrimaryKeyValAtLoadTime

その後、影響を受ける行の数が期待値と一致するかどうかをチェックします。

そのため、PK を変更しようとすると、更新コマンドは行を更新せず、チェックは失敗します。

本当の問題は、なぜ主キーの値を変更したいのかということです。

于 2012-11-27T15:46:02.877 に答える
2
public void Save(object entity)
        {
            using (var transaction = Connection.BeginTransaction())
            {
            try
                    {
                        SaveChanges();
                        transaction.Commit();
                    }
                    catch (OptimisticConcurrencyException)
                    {
                        if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                            this.Refresh(RefreshMode.StoreWins, entity);
                        else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                            Detach(entity);
                        AcceptAllChanges(); 
                        transaction.Commit();
                    }
            }
        }
于 2012-12-16T18:11:30.850 に答える