Entity cannot be referenced by multiple instances

Asked

Viewed 742 times

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 cannot be referenced by Multiple instances of Ientitychangetracker.

  • What makes the method Tarde?

  • updated the question.

  • tried to call db.Entry(atividade).State = EntityState.Detached; before your Return in the Afternoon method?

  • Didn’t work...

1 answer

2


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

Even if you insist on getting around the problem, you are failing to take advantage of what the Entity Framework brings best.

The general idea, and what makes the Entity Framework so powerful, is that it "observes" all the entities that you search for from the Bank, and that you add in context. So with a single SaveChanges(), it, saves all entities at a single time (atomic form), running 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 tutorial msdn showing, for example, that you do not need to use the Using(DbContext) in each action.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.