Если объект 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 лает, потому что вы не можете иметь две строки с одинаковым значением первичного ключа в стол.