Entity can not be referenced by multiple instances

3

I'm trying to save the data in this method here ...

public ActionResult AtualizaInicioAtividade(Atividade atividadePre, Atividade atividadePrincipal)
    {
        try
        {
            using (CPMDatabaseEntities db = new CPMDatabaseEntities())
            {
                atividadePre.Ativo = atividadePre.Ativo;
                atividadePre.CodigoMilestone = atividadePre.CodigoMilestone;
                atividadePre.Descricao = atividadePre.Descricao;
                atividadePre.Inicio = atividadePrincipal.TerminoCedo.AddDays(1);
                atividadePre.InicioCedo = atividadePre.Inicio;
                atividadePre.TerminoCedo = atividadePre.TerminoCedo.AddDays(atividadePre.TempoRevisado);

                Tarde(atividadePre);


                db.Entry(atividadePre).State = EntityState.Modified;
                db.SaveChanges();

                return RedirectToAction("Dashboard");
            }
        }
        catch (Exception)
        {

            throw;
        }
    }
// metodo ainda em construcao
 public ActionResult Tarde(Atividade atividade)
    {
        try
        {
            using (CPMDatabaseEntities db = new CPMDatabaseEntities())
            {
                int QtdDependencia = db.Dependencia.Where(a => a.AtividadePrincipal == atividade.Codigo).Count();

                if (QtdDependencia == 0)
                {
                    atividade.TerminoTarde = atividade.InicioCedo.AddDays(atividade.TempoRevisado);
                    atividade.InicioTarde = atividade.TerminoTarde.AddDays(atividade.TempoRevisado * -1);
                }

                if (QtdDependencia == 1)
                {
                    atividade.InicioTarde = Convert.ToDateTime("10/10/2015");
                    atividade.TerminoTarde = Convert.ToDateTime("10/10/2015"); 
                }

                return View(atividade);
            }             
        }
        catch (Exception)
        {

            throw;
        }

    }

But this error appears here:

An exception of type 'System.InvalidOperationException' occurred in ISystemCritical.dll but was not handled in user code Additional information: An entity object can not be referenced by multiple instances of IEntityChangeTracker.

    
asked by anonymous 24.10.2015 / 21:22

1 answer

2

This error is happening because you are using two DbContext to handle the same entity. You could even use the Detach method in older versions of the Entity Framework and I believe that the @Bruno method would work, but know that this method has been removed for a reason: Unlike the Attach, Add, and Remove methods, Deatach did not operate in entity relationships, so you would have to worry about calling Detach for each of the related entities (child entities) manually.

Even though you insist on getting around the problem, you're missing out on what the Entity Framework does best.

The general idea, and what makes the Entity Framework so powerful, is that it "notices" all entities that you seek from the Bank, and that you add in the context. Thus, with a single SaveChanges() , it saves all entities at once (atomically), executing inserts, updates or deletes as needed.

This means that the best thing to do in your case is to rewrite your flow, avoiding that two contexts have to be created:

 public ActionResult AtualizaInicioAtividade(Atividade atividadePre, Atividade atividadePrincipal)
        {
            try
            {
                using (CPMDatabaseEntities db = new CPMDatabaseEntities())
                {
                    atividadePre.Ativo = atividadePre.Ativo;
                    atividadePre.CodigoMilestone = atividadePre.CodigoMilestone;
                    atividadePre.Descricao = atividadePre.Descricao;
                    atividadePre.Inicio = atividadePrincipal.TerminoCedo.AddDays(1);
                    atividadePre.InicioCedo = atividadePre.Inicio;
                    atividadePre.TerminoCedo = atividadePre.TerminoCedo.AddDays(atividadePre.TempoRevisado);

                    ConfiguraTarde(db, atividadePre);


                    db.Entry(atividadePre).State = EntityState.Modified;
                    db.SaveChanges();

                    return RedirectToAction("Dashboard");
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

private void ConfiguraTarde(CPMDatabaseEntities db , Atividade atividade){
                    int QtdDependencia = db.Dependencia.Where(a => a.AtividadePrincipal == atividade.Codigo).Count();

                    if (QtdDependencia == 0)
                    {
                        atividade.TerminoTarde = atividade.InicioCedo.AddDays(atividade.TempoRevisado);
                        atividade.InicioTarde = atividade.TerminoTarde.AddDays(atividade.TempoRevisado * -1);
                    }

                    if (QtdDependencia == 1)
                    {
                        atividade.InicioTarde = Convert.ToDateTime("10/10/2015");
                        atividade.TerminoTarde = Convert.ToDateTime("10/10/2015"); 
                    }

}

    // metodo ainda em construcao
     public ActionResult Tarde(Atividade atividade)
        {
            try
            {
                using (CPMDatabaseEntities db = new CPMDatabaseEntities())
                {
                   ConfiguraTarde(db , atividade);

                    return View(atividade);
                }             
            }
            catch (Exception)
            {

                throw;
            }

        }

This should resolve at the moment, but I advise you to read this great msdn tutorial which shows, for example, that you do not need to use% action.

    
24.10.2015 / 23:09