ASP.NET 5 EF 7 无法更新数据库表中的条目

本文关键字:数据库 更新 NET EF ASP | 更新日期: 2023-09-27 18:33:33

我正在创建一个API,它将启用CRUD功能以在数据库中创建,读取,更新和删除记录。

遇到了一个问题,由于共享实例而不允许我更新表中的条目,并且出现以下错误。

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."

这是我的代码:

[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 });
            }
        }

在上面的代码中,您会注意到我首先使用存储库_repository.GetPackageById(Id)获取记录,这允许我验证记录是否在数据库中,并且我可以继续使用存储库_repository.UpdatePackage(updatePackage)更新。如果我在控制器中注释掉下面的代码,我可以将数据保存在数据库中。

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

我还确保我在启动配置中使用了 AddScoped,如此线程中所述。

services.AddScoped<IAutomationRepository, AutomationRepository>();

我不确定为什么在调用时不能对同一 ID 使用多个 DBContext 实例。

任何建议都非常感谢。 :)

更新 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);
        }

ASP.NET 5 EF 7 无法更新数据库表中的条目

像下面这样更改存储库方法。这可能会有所帮助。让我们知道会发生什么

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