, Объект с таким же ключом уже существует в ObjectStateManagerObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь просто обновить объект сущности, и я получаю эту ошибку .. Все прибегая к поиску ошибки, которую я сделал, приводит меня к сложным объяснениям ... Кто-нибудь может сказать это просто?

Я работаю над этим простым уроком

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();

вот что выше в коде, который я использую, чтобы получить значение первичного ключа ... возможно, лучший способ, но он работает.

   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;

1 Ответ

1 голос
/ 24 сентября 2010

Если объект oFinancial произошел от вашего dc, и вы никогда не отсоединяли его вручную, то нет смысла вызывать метод Attach или связываться с ObjectStateManager. Пока dc знает об объекте (что он делает, если вы не отсоединяете его), ObjectStateManager будет отслеживать все сделанные вами изменения и соответствующим образом обновлять их при вызове dc.SaveChanges().

РЕДАКТИРОВАТЬ: Вот реорганизованная версия того, что вы опубликовали, надеюсь, это поможет:

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();

Еще одна вещь: если iFid является первичным ключом, то вы не должны связываться с ним, пока этот объект пришел из dc. Я считаю, что проблема в том, что вы сбрасываете первичный ключ (iFid) на то же значение другого объекта в dc, и EF4 лает, потому что вы не можете иметь две строки с одинаковым значением первичного ключа в стол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...