Die Instanz der entity-Typ 'BookLoan' kann nicht verfolgt werden

Ich bin versucht, zu aktualisieren eine Entität, und ich habe in den folgenden Fehler:

InvalidOperationException: Die Instanz der entity-Typ 'BookLoan'
kann nicht verfolgt werden, weil eine andere Instanz dieses Typs mit dem gleichen
Schlüssel wird bereits verfolgt. Beim hinzufügen neuer Entitäten, für die meisten Schlüssel
Arten einen eindeutigen temporären Schlüssel-Wert erstellt werden, wenn kein Schlüssel festgelegt ist
(d.h., wenn die key-Eigenschaft ist der Standardwert zugeordnet, die für seinen Typ).
Wenn Sie explizit festlegen Schlüssel-Werte für die neuen Einheiten, sicherzustellen, dass Sie
nicht kollidieren mit bestehenden Einrichtungen oder temporäre Werte generiert
für andere neue Einheiten. Bei der Befestigung der vorhandenen Einrichtungen, sicherzustellen, dass
nur eine Person-Instanz mit einem gegebenen Schlüssel-Wert verbunden ist, um den
Kontext.

Ich habe getan ein wenig Forschung und von dem, was ich sagen kann, ich bin offenbar versucht, eine Spur bereits verfolgt, entity wenn ich _context.Update(bookloan); aber ich bin mir nicht wirklich sicher, was zu tun ist.

Was ich versuche zu tun ist, aktualisieren Sie eine vorhandene Entität-Datensatz in meiner Datenbank. Hier sind die get-und post-Controllern bin ich mir nicht sicher, was anderes zu teilen.

Bekommen

    [HttpGet]
    public async Task<IActionResult> Return(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        if (isBookCheckedOut(id) == false)
        {
            //Not checked out
            return RedirectToAction("Index");
        }
        else
        {
            var bookloan = (from book in _context.Books.Where(b => b.BookId == id)
                        join loan in _context.BookLoans.Where(x => !x.ReturnedOn.HasValue) on book.BookId equals loan.BookID into result
                        from loanWithDefault in result.DefaultIfEmpty()
                        select new BookReturnViewModel
                        {
                            BookLoanID = loanWithDefault.BookLoanID,
                            BookID = book.BookId,
                            Title = book.Title,
                            StudentID = loanWithDefault == null ? null : loanWithDefault.StudentID,
                            StudentFristName = loanWithDefault == null ? null : loanWithDefault.Student.FirstName,
                            StudentLastName = loanWithDefault == null ? null : loanWithDefault.Student.LastName,
                            //Fines
                            CheckedOutOn = loanWithDefault == null ? (DateTime?)null : loanWithDefault.CheckedOutOn,
                            IsAvailable = loanWithDefault == null,
                            AvailableOn = loanWithDefault == null ? (DateTime?)null : loanWithDefault.DueOn
                        }).FirstOrDefault();

            if (bookloan == null)
            {
                return NotFound();
            }

            return View(bookloan);
        }
    }

Post:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Return(BookReturnViewModel model)
    {


        if (ModelState.IsValid && isBookCheckedOut(1) == true)
        {
            var bookloan = new BookLoan()
            {
                BookLoanID = model.BookLoanID,
                BookID = model.BookID,
                StudentID = model.StudentID,
                CheckedOutOn = (DateTime)model.CheckedOutOn,
                DueOn = (DateTime)model.AvailableOn,
                ReturnedOn = DateTime.Now
            };


            try
            {

                _context.Update(bookloan);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {

            }

            return RedirectToAction("Index");
        }
        else
        {

        }

        return View();
    }
  • Anstelle oder 'erstellen' eine neue BookLoan, Holen Sie sich die vorhandenen Entität aus der Datenbank basierend auf der ID (z.B. BookLoan data = db.BookLoans.Where(x => x.BookLoanID == model.BookLoanID).FirstOrDefault();) und aktualisieren Sie Ihre Eigenschaften basierend auf der view-Modell und speichern Sie es dann.
  • Danke, das funktioniert perfekt! Ich würde mark, die als die Antwort, aber ich glaube nicht, dass ich das nicht für Kommentare. Die Art, wie ich versuche zu tun, es war mir einfach imitiert, was ich gesehen habe Entität tun, wenn ein edit mit Gerüst gemacht.
Schreibe einen Kommentar