0

これは私が得る例外です:

「提供されたオブジェクトのキーと一致するキーを持つオブジェクトが ObjectStateManager で見つかりませんでした。提供されたオブジェクトのキー値が、変更を適用する必要があるオブジェクトのキー値と一致することを確認してください。」

次の行で削除されます。

public void UpdateTransaction(Transaction transaction)
{
   db.Transactions.ApplyCurrentValues(transaction);
}

このページで、添付されていないためにエラーが発生する可能性があることを読みましたが、添付しようとすると別の例外が発生します。

「エンティティ オブジェクトは、IEntityChangeTracker の複数のインスタンスによって参照できません。」

これは、レコードがすでにモデルに関連付けられていることを意味します。

そして、それを切り離そうとすると、次のようになります:

「オブジェクトは ObjectStateManager にアタッチされていないため、デタッチできません。」

これは、テーブル「InputValue」を更新するコントローラーです。値に応じて、updatedTransactions 関数によって行われるテーブル「Transaction」も更新したいと考えています。

    [HttpPost]
    public ActionResult Edit(int id, FormCollection collection)
    {
        var inputValue = inputValueRespository.GetInputValue(id);

        if (inputValue == null)
            return RedirectToAction("Index");

        try
        {
            UpdateModel(inputValue, collection.ToValueProvider());
            inputValue.InputValues_EditUser = WindowsIdentity.GetCurrent().Name;
            inputValue.InputValues_EditDate = DateTime.Today.Date;
            inputValueRespository.UpdateInputValue(inputValue);
            List<Transaction> updatedTransactions = inputValueRespository.HasTransactions(inputValue.Input_ID, inputValue.InputValues_Date, inputValue.InputValues_Week, inputValue.InputValues_Quarter);
            for (int i = 0; i < updatedTransactions.Count; i++)
            {

                transactionRepository.UpdateTransaction(updatedTransactions[i]);
            }
            inputValueRespository.save();
            return RedirectToAction("Create");
        }
        catch (Exception)
        {
            return View("Create");
        }

これは機能です:

public List<Transaction> HasTransactions(int id, DateTime date, string week, string quarter)
    {
       // random code that decides if transaction should be update
         Transaction transaction = new Transaction();
            transaction = (from a in db.Transactions where a.KPI_ID == kpiId && a.Transaction_Period == period select a).SingleOrDefault();

// 新しい結果を生成したランダム コード

                // fill the list of transaction that will be returned         
                transaction.Transaction_Value = result;
                trasactions.Add(transaction);
            }
        }
        return trasactions;
    }

私はこれについて完全に無知です。どんな助けでも大歓迎です。

PS: ApplyCurrentValue を使用する他のコードは完全に機能します。

4

1 に答える 1

0

私は最終的にそれを機能させました(試行錯誤により)

最後に、オブジェクトをデタッチし、アタッチし、変更し、適用してから保存する必要があります。

db.Transactions.Detach(transaction);
db.Transactions.Attach(transaction);
transaction.Transaction_Value = result;
db.Transactions.ApplyCurrentValues(transaction);
db.SaveChanges();

あまり意味がありませんが、それが機能する方法だと思います:)

于 2013-04-17T20:36:11.937 に答える