使用实体框架更新集合时出错

时间:2012-06-27 18:48:42

标签: c# entity-framework

当我尝试更新一个与其相关联的集合的实体时,我收到以下消息。

  

“ObjectStateManager中已存在具有相同键的对象。   ObjectStateManager无法跟踪具有相同对象的多个对象   键“。

我通过参数接收带有新属性的实体。 Eventos有一系列Clientes,其中包括Eventos。

这是代码:

public int Modificar(Eventos eventos)
{
    try
    {
         DBEntities DB = new DBEntities();
         Eventos objEvento = 
             DB.Eventos.Where(x => x.Id_evento == eventos.Id_evento)
                       .SingleOrDefault();

         eventos.Porcentaje_Pagado = objEvento.Porcentaje_Pagado;

         DB.Eventos.Attach(eventos);
         DB.Eventos.ApplyCurrentValues(eventos);

         DB.ObjectStateManager
             .ChangeObjectState(eventos, System.Data.EntityState.Modified);
         DB.SaveChanges();
         return eventos.Id_evento;
    }
    catch (Exception )
    {
         throw;
    }

}

问题在于“附加”。

有什么问题?

*编辑**

部分工作,它保存了“Eventos”的新数据,但是当我尝试更新与Eventos相关联的“Clientes”列表时,我收到以下错误。

  

“无法设置'Eventos _...'类型的属性'Clientes',因为该集合已经>​​已设置为EntityCollection。”

错误符合:objEvento.Clientes = eventos.Clientes;

代码:

DBEntities DB = new DBEntities(); 
Eventos objEvento = DB.Eventos.Where(x => x.Id_evento == eventos.Id_evento).SingleOrDefault(); 
objEvento.Porcentaje_Pagado = eventos.Porcentaje_Pagado; 
objEvento.Clientes = eventos.Clientes; 
DB.SaveChanges();

2 个答案:

答案 0 :(得分:0)

您已使用以下代码加载实体:

 Eventos objEvento = 
         DB.Eventos.Where(x => x.Id_evento == eventos.Id_evento)
                   .SingleOrDefault();

您将需要更新已加载到对象上下文中的实体。

更新objEvento,然后应用并保存。

答案 1 :(得分:0)

请改为尝试:

public int Modificar(Eventos eventos) 
{ 
     DBEntities DB = new DBEntities(); 
     Eventos objEvento =  
         DB.Eventos.Where(x => x.Id_evento == eventos.Id_evento) 
                   .SingleOrDefault(); 


     objEvento.Porcentaje_Pagado =  eventos.Porcentaje_Pagado;

     DB.SaveChanges(); 

     return objEvento.Id_evento; 

}