punkouter
punkouter

Reputation: 5366

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

I am trying to simply update the entity object and I get this error.. All the googling on the error I did takes me to complex explanations... can anyone put it simply?

I am working of of this simple tutorial

http://aspalliance.com/1919_ASPNET_40_and_the_Entity_Framework_4__Part_2_Perform_CRUD_Operations_Using_the_Entity_Framework_4.5

else
                    {
                        //UPDATE
                        int iFid = Int32.Parse(fid.First().fid.ToString());
                        oFinancial.fid = iFid;
                        oFinancial.mainqtr = currentQuarter;
                        oFinancial.mainyear = currentYear;
                        oFinancial.qtr = Int32.Parse(currentQuarter);
                        oFinancial.year = Int32.Parse(currentYear);
                        oFinancial.updatedate = DateTime.Now;
                        // ObjectStateEntry ose = null;
                        // if (!dc.ObjectStateManager.TryGetObjectStateEntry(oFinancial.EntityKey, out ose))
                        // {                      
                        dc.financials.Attach(oFinancial);
                        // }

                        dc.ObjectStateManager.ChangeObjectState(oFinancial, System.Data.EntityState.Modified);
                    }

                    dc.SaveChanges();

here is what is higher up in the code that I use simple to get me the primary key value.. probably a better way but it works.

   var fid = from x in dc.financials
                  where iPhaseID == x.phaseid &&
                         strTaskID == x.ftaskid &&
                         strFundType == x.fundtype &&
                         iCurrentQuarter == x.qtr &&
                         iCurrentYear == x.year
                  select x;

Upvotes: 0

Views: 753

Answers (1)

Scott Arrington
Scott Arrington

Reputation: 12523

If the oFinancial object came from your dc and you never manually detached it, then there is no reason to call the Attach method or to mess with the ObjectStateManager. As long as the dc knows about the object (which it does unless you detach it), then the ObjectStateManager will keep track of any changes you make and update them accordingly when you call dc.SaveChanges().

EDIT: Here's a refactored version of what you posted, hope it helps:

else {
    //UPDATE
    // as long as oFinancial was never detatched after you retrieved
    // it from the "dc", then you don't have to re-attach it.  And
    // you should never need to manipulate the primary key, unless it's
    // not generated by the database, and you don't already have another
    // object in the "dc" with the same primary key value.

    int iFid = Int32.Parse(fid.First().fid.ToString());
    oFinancial.fid = iFid;
    oFinancial.mainqtr = currentQuarter;
    oFinancial.mainyear = currentYear;
    oFinancial.qtr = Int32.Parse(currentQuarter
    oFinancial.year = Int32.Parse(currentYear);
    oFinancial.updatedate = DateTime.Now;
}
dc.SaveChanges();

One other thing: if iFid is the primary key, then you shouldn't mess with it as long as this object came from the dc. I believe the problem is that you're resetting the primary key (iFid) to the same value of another object within the dc, and EF4 is barking because you can't have two rows with the same primary key value in a table.

Upvotes: 1

Related Questions