2014-03-03 60 views
0

asp.net mvc 5,實體框架6.0。我有ADO.NET EDM模型。我需要更新多個實體。如果我多次使用Entry,我不例外:ObjectStateManager已經有一個具有相同密鑰的對象。 我怎麼能做到這一點,使用像這樣的代碼:我可以反覆使用Entry嗎?

db.Entry(company.Company).State = EntityState.Modified; //one type object 
db.SaveChanges(); 
db.Entry(company.Preview).State = EntityState.Modified; //another type object 
db.SaveChanges(); 

foreach (CompanyTelephone item in company.Phones) // another type 
{ 
    if (item.Id > 0) 
    { 
     db.Entry(item).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 
    else 
    { 
     db.CompanyTelephones.Add(item); 
    } 

} 
db.SaveChanges(); 
+0

難道是在您的公司.Phones收藏中您有多個記錄使用相同的密鑰嗎?另外你爲什麼要多次調用SaveChanges? – Damon

+0

號碼在電話中,所有的密鑰都不同。但是,在手機和公司或預覽中的ID可能會重合,它會導致錯誤。 對於Savechanges:我認爲它重置ObjectStateManager,但它不是。 – Buboon

回答

0

您可以使用Entry往往你想要的。問題在於設置狀態。如果您設置了item附加到上下文的狀態。顯然,前兩行中已經附加了一些項目。你可以簡單地檢查一個item是否Detached

if (item.Id > 0 && db.Entry(item).State == EntityState.Detached) 
{ 
    db.Entry(item).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
else 
{ 
    db.CompanyTelephones.Add(item); 
} 

儘管如此,正如安德烈說,多SaveChanges呼叫不應是必要的。你打破了交易單位。也許沒關係。儘管如此,循環內的調用會導致大量單獨的數據庫rondtrips。

相關問題