1

ヘルパー メソッドを使用して一連のモデル オブジェクトを更新するのに問題があります。テーブルはルックアップ テーブルを使用して、エージェント/ユーザーごとに 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.
4

2 に答える 2

0

これを試して:

db.RelationshipCodeLookup.Attach(relCode);
db.Entry(relCode).State = EntityState.Modified;

更新の場合、切り離されたオブジェクトをアタッチしてから、その状態を変更済みに設定します。

于 2013-11-14T22:56:04.203 に答える
0

ここでの問題は、Entity Framework が同じ種類の 2 つのオブジェクトを同時に追跡できないことです。そのため、この問題の解決策は少し奇妙だと思います。を呼び出し.Find()DbContext、モデル オブジェクトの 2 番目のコピーをインスタンス化することで、最終的に保存することができました。エラーメッセージでEFが私のためにレイアウトしていたすべてのルールを破るように見えますが、うまくいきます。

    public void SaveRelationshipCodes(int id, RelationshipCodeLookup relCode)
    {
        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)
        {
            //Need to call .Find to get .CurrentValues method call to work
            RelationshipCodeLookup dbRelCode = db.RelationshipCodeLookup.Find(id, relCode.RelCodeOrdinal); 
            db.Entry(dbRelCode).CurrentValues.SetValues(relCode);
        }
        else
        {
            if(relCode.RelCodeOrdinal == 0) relCode.RelCodeOrdinal = FindOrdinal(relCode);
            db.RelationshipCodeLookup.Add(relCode);
        }

        db.SaveChanges();
    }
于 2013-11-15T16:41:45.423 に答える