none
No se puede rastrear una instancia por que esta siendo rastreada RRS feed

  • Pregunta

  • Saludos buenas, estoy teniendo un pequeño inconveniente al actualizar registros en mi base de datos, estoy teniendo el siguiente error: 

    The instance of entity type 'TAccionesInFormularios' cannot be tracked because another instance with the same key value for {'ID'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.

    Se me ha dificultado encontrar una respuesta clara que me ayude a en futuros procesos evitar esto. 

    A continuación mi código: Hice unos comentarios dentro para ver si me pueden ayudar

    public async Task<bool> updateForm(InputModelFormularios toSaveForm)
            {
                TFormularios toUpdateForm = new TFormularios();//Formulario que se va a editar 
                List<TAccionesInFormularios> toUpdateAccion = _LAccionesInForm.accionesInformList(toSaveForm.ID); //Lista de acciones que tiene este formulario
                List<TAcciones> ListAcciones = _context.TAcciones.ToList(); //Lista de acciones existentes en la tabla de acciones
                TAccionesInFormularios _toAddAccion = new TAccionesInFormularios();//Acciones que van a la tabla de acciones en el formulario para acutalizar el estado
                var valor = false; //valor para retornar el resultado del método
                if (toSaveForm != null)
                {
                    var strategy = _context.Database.CreateExecutionStrategy();
                    await strategy.ExecuteAsync(async () =>
                    {
                        using (var transaccion = _context.Database.BeginTransaction())
                        {
                            try
                            {
                                toUpdateForm = new TFormularios
                                {
                                    ID = toSaveForm.ID,
                                    Descripcion = toSaveForm.Descripcion,
                                    Estado = toSaveForm.Estado,
                                    ModulosID = toSaveForm.ModulosID,
                                    Padre = toSaveForm.Padre
                                };
                                _context.Update(toUpdateForm);
                                await _context.SaveChangesAsync(); //Hasta aqui la parte de actualizar el formulario y funciona correctamente
                                List<int> accInform = new List<int>(); //variable que obtiene la lista de las acciones a actualizar
                                foreach (var aim in toSaveForm.AccionesList)
                                {
                                    if (aim.Estado)
                                    {
                                        accInform.Add(aim.ID);
                                    }
                                }
                                foreach (var item in toUpdateAccion)
                                {
    
                                    if (_LAccionesInForm.accionGuardada(item.AccionesId, item.FormulariosId))//En esta parte verifico si ya la Accion esta asignada a un formulario mediante el accionId y el FormularioID
                                    {
                                        _toAddAccion = new TAccionesInFormularios
                                        {
                                            ID = item.ID,//Este id es el que viene dado del registro en la tabla TAccionesInFormularios donde se encuentra almacenado el registro AccionId que pertenece al FormularioID
                                            FormulariosId = item.FormulariosId,
                                            AccionesId = item.AccionesId,
                                            pertenece = accInform.Contains(item.ID)
                                        };
                                        _context.Update(_toAddAccion);//Aqui es donde me resulta el error
                                        await _context.SaveChangesAsync();
                                    }
                                    else
                                    {
                                        _toAddAccion = new TAccionesInFormularios //Esta parte corresponde para cuando exista una nueva Acción
                                        {
                                            FormulariosId = item.FormulariosId,
                                            AccionesId = item.AccionesId,
                                            pertenece = accInform.Contains(item.ID)
                                        };
                                        _context.Update(_toAddAccion);
                                        await _context.SaveChangesAsync();
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                _miModel.ErrorMessage = ex.Message;
                                transaccion.Rollback();
                                valor = false;
                            }
                        }
                    });
                }
                else
                {
                    _miModel.ErrorMessage = $"Ha ocurrido un error al momento de Actualizar el formulario!, Intentelo de nuevo.";
                    valor = false;
                }
                return valor;
            }

    La clase que busca e interactúa con esa tabla es la siguiente:

     public class LAccionesInForm : ListObject
        {
            
            public LAccionesInForm(SignInManager<IdentityUser> signInManager, ApplicationDbContext context)
            {
                _signInManager = signInManager;
                _context = context;
            }
            public List<TAccionesInFormularios> accionesInformList(int IdForm)
            {
                return _context.TAccionesInFormularios.Where(ai => ai.FormulariosId.Equals(IdForm)).ToList();
            }
            private TAcciones getAccion(int AccionId)
            {
                return _context.TAcciones.FirstOrDefault(a => a.ID.Equals(AccionId));
            }
            public List<TAcciones> getAccionesList(int FormId)
            {
                var formularioLista = accionesInformList(FormId);
                var allAccion = _context.TAcciones.ToList();
                List<TAcciones> accionesList = new List<TAcciones>();
                foreach(var item in formularioLista)
                {
                    var acc = getAccion(item.AccionesId);
                    accionesList.Add(new TAcciones
                    {
                        ID = item.AccionesId,
                        Descripcion = acc.Descripcion,
                        Fecha = acc.Fecha,
                        Estado = item.pertenece
                    });
                }
                return accionesList;
            }
    
            public bool accionGuardada(int accionId, int formId)
            {
                if (formId.Equals(0))
                {
                    return false;
                }
                else
                {
                    var existe = _context.TAccionesInFormularios.FirstOrDefault(m => m.AccionesId.Equals(accionId) && m.FormulariosId.Equals(formId));
                    if (existe != null)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }

    Gracias Anticipadas


    Jonathan Luna

    domingo, 15 de marzo de 2020 23:06