ヘルパー メソッドを使用して一連のモデル オブジェクトを更新するのに問題があります。テーブルはルックアップ テーブルを使用して、エージェント/ユーザーごとに 5 つのレコードを保持します。エージェントのレコードを保存する場合は、そのレコードをAgentTransmission
テーブルに保存し、テーブルに最大 5 つの他のレコードを保存する必要がありRelationshipCodeLookup
ます。
これをエージェントごとに 5 回実行する必要があり、Create メソッドと Edit メソッドでプロセスを実行する必要があるため、レコードを保存するためのヘルパー メソッドを作成しました。これは、単にDbContext.Add()
. ただし、更新を実行する必要がある場合、エラーメッセージが表示されます
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
これは、モデル オブジェクトをヘルパー メソッドに渡しているという事実に関係していると思います。したがって、DbContext
追跡する必要がある 2 つの別個のオブジェクトがあると考えています。これは、コメント アウトされたコード行が問題なく機能し、オブジェクトを保存できるためです。ただし、オブジェクトをヘルパー メソッドに渡すと、上記のエラーが発生します。
これを回避する方法を知っている人はいますか(ヘルパーメソッドを使用して更新を実行します)?
コントローラ アクション
//Save relationship codes in lookup table
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode1))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode1, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode2))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode2, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode3))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode3, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode4))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode4, agenttransmission.ID);
}
if (AgentTransmissionValidator.ValidateRelationshipCode(agenttransmission.RelationshipCode5))
{
//db.Entry(agenttransmission.RelationshipCode1).State = EntityState.Modified;
//db.SaveChanges();
SaveRelationshipCodes(agenttransmission.RelationshipCode5, agenttransmission.ID);
}
ヘルパー メソッド
public void SaveRelationshipCodes(RelationshipCodeLookup relCode, int id)
{
if (relCode.AgentId == 0) relCode.AgentId = id;
relCode.LastChangeDate = DateTime.Now;
relCode.LastChangeId = Security.GetUserName(User);
//Check to see if record exists and if not add it
if (db.RelationshipCodeLookup.Find(id, relCode.RelCodeOrdinal) != null)
{
db.Entry(relCode).State = EntityState.Detached;
}
else
{
if(relCode.RelCodeOrdinal == 0) relCode.RelCodeOrdinal = FindOrdinal(relCode);
db.RelationshipCodeLookup.Add(relCode);
}
db.SaveChanges();
}
編集
ウェブを精査した後、この方法で保存しようとしました
//Check to see if record exists and if not add it
if (db.RelationshipCodeLookup.Find(id, relCode.RelCodeOrdinal) != null)
{
db.Entry(relCode).CurrentValues.SetValues(relCode);
}
else
{
Member 'CurrentValues' cannot be called for the entity of type 'RelationshipCodeLookup because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<RelationshipCodeLookup>
ただし....それを行うと、次のエラーが発生して最初に戻るだけですdb.RelationshipCodeLookup.Attach(relCode);
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.