我有一個使用實體框架5的N層的ASP.NET WebForms項目。 我有兩個實體:Cliente和Banda。 一個Cliente可能有很多班的,而且一個班可能有很多Cliente的在EF5中更新多對多關係時出錯
在bussines層我有這樣的代碼:
public void Update(Cliente cliente)
{
using (MegaStudioEntities contexto = new MegaStudioEntities())
{
if (contexto.Entry(cliente).State == EntityState.Detached)
contexto.Entry(cliente).State = EntityState.Modified;
//Delete existing relations
var qBandas = from qb in contexto.Bandas.Where(b => b.Clientes.Any(c => c.IdCliente == cliente.IdCliente))
select qb;
foreach (Banda b in qBandas.ToList())
((IObjectContextAdapter)contexto).ObjectContext.ObjectStateManager.ChangeRelationshipState(cliente, b, c => c.Bandas, EntityState.Deleted);
contexto.SaveChanges();
//Adding new relations
foreach (Banda banda in cliente.Bandas)
{
contexto.Bandas.Attach(banda);
((IObjectContextAdapter)contexto).ObjectContext.ObjectStateManager.ChangeRelationshipState(cliente, banda, c => c.Bandas, EntityState.Added);
}
cliente.TipoCliente = contexto.TipoClientes.Find(cliente.IdTipoCliente);
cliente.FechaModificacion = System.DateTime.Now;
Encriptar(cliente);
contexto.SaveChanges();
}
}
我第一次調用Update方法,成功地運行,但第二次我得到這個錯誤:
「ObjectStateManager中已存在具有相同鍵的對象,ObjectStateManager無法使用同一個鍵跟蹤多個對象。
我忘了關閉什麼? 這是更新EF5中多對多關係的正確方法嗎?
在此先感謝!
馬丁
更新1:
最後我的代碼是這樣的:
public void Update(Cliente cliente)
{
using (MegaStudioEntities contexto = new MegaStudioEntities())
{
Cliente savedClient = contexto.Clientes.Find(cliente.IdCliente);
foreach (var banda in savedClient.Bandas.ToList())
{
savedClient.Bandas.Remove(contexto.Bandas.Find(banda.IdBanda));
}
foreach (var banda in cliente.Bandas)
{
savedClient.Bandas.Add(contexto.Bandas.Find(banda.IdBanda));
}
contexto.Entry(savedClient).CurrentValues.SetValues(cliente);
contexto.SaveChanges();
}
}
感謝格特·阿諾德!
你在哪一行得到錯誤? –
wery重要的行'savedClient.Bandas.Remove(contexto.Bandas.Find(banda.IdBanda))' – Kuncevic