ASP.NET 5 EF 7 no puede actualizar la entrada en la tabla de la base de datos

asp.net asp.net-mvc c# entity-framework entity-framework-core

Pregunta

Estoy creando una API que habilitará la funcionalidad CRUD para crear, leer, actualizar y eliminar registros en la base de datos.

Me estoy encontrando con un problema que no me permite actualizar la entrada dentro de una tabla debido a que una instancia se comparte y obtengo un error por debajo.

cannot be tracked because another instance of this type with the same key is already being tracked. For new entities consider using an IIdentityGenerator to generate unique key values."

Aquí está mi código:

[HttpPut("{id}")]
        public JsonResult Put(int Id, [FromBody]PackageVersion updatePackage)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    if (updatePackage == null || updatePackage.Id != Id)
                    {
                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
                        return Json(new { status = "Bad Request" });
                    }

                    var package = _respository.GetPackageById(Id);
                    if (package == null)
                    {
                        Response.StatusCode = (int)HttpStatusCode.NotFound;
                        return Json(new { status = "Not Found", Message = package });
                    }

                    _respository.UpdatePackage(updatePackage);
                    if (_respository.SaveAll())
                    {
                        Response.StatusCode = (int)HttpStatusCode.Accepted;
                        return Json(updatePackage);
                    }
                }
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json(new { status = "Failed", ModelState = ModelState });
            }
            catch (Exception ex)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json(new { status = "Failed", Message = ex.Message });
            }
        }

En el código anterior, notará que primero _repository.GetPackageById(Id) un registro al usar el repositorio _repository.GetPackageById(Id) , lo que me permite validar que un registro está en la base de datos y puedo continuar actualizando mediante el uso del _repository.UpdatePackage(updatePackage) . Si comento el siguiente código en mi controlador, puedo guardar los datos en la base de datos.

//var package = _respository.GetPackageById(Id);
//if (package == null)
//{
//    Response.StatusCode = (int)HttpStatusCode.NotFound;
//    return Json(new { status = "Not Found", Message = package });
//}

También me aseguré de que estaba usando AddScoped en la configuración de inicio como se menciona en este hilo .

services.AddScoped<IAutomationRepository, AutomationRepository>();

No estoy seguro de por qué no puedo usar varias instancias de DBContext para el mismo ID cuando se llama.

Cualquier sugerencia es realmente apreciada. :)

ACTUALIZACIÓN 1:

public class AutomationRepository : IAutomationRepository
    {
        private AutomationDBContext _context;

        public AutomationRepository(AutomationDBContext context)
        {
            _context = context;
        }

        public void AddPackage(PackageVersion newPackage)
        {
            _context.Add(newPackage);
        }

        public void DeletePackage(int id)
        {
            var package = _context.PackageVersions.SingleOrDefault(p => p.Id == id);
            _context.PackageVersions.Remove(package);
        }

        public IEnumerable<PackageVersion> GetAllPackages()
        {
            return _context.PackageVersions.OrderBy(p => p.PackageName).ToList();
        }

        public object GetPackageById(int id)
        {
            return _context.PackageVersions.SingleOrDefault(p => p.Id == id);
        }

        public bool SaveAll()
        {
            return _context.SaveChanges() > 0;
        }

        public void UpdatePackage(PackageVersion updatePackage)
        {
            _context.Update(updatePackage);
        }

Respuesta aceptada

Cambie su método de repositorio como a continuación. Esto puede ayudar. Háganos saber lo que pasa

public object GetPackageById(int id)
{ 
 return _context.PackageVersions.AsNoTracking().SingleOrDefault(p => p.Id ==id);
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué